2016-06-14 88 views
1

我正在一個TeamCity的服務器上,我建立的一個命令是:管道輸出到標準輸出,然後命令然後可變

xcodebuild -scheme "<myscheme>" archive 

我需要檢索.dSYM文件

code=$(cat <<-'CODE' 
$lines = file("php://stdin"); 
foreach($lines as $line){ 
    if(preg_match("#Touch (.*dSYM)#",$line,$m))echo "$m[1]\n"; 
} 
CODE 
) 
dsym=$(xcodebuild -scheme "<myscheme>" archive | php -r "$code") 

這將工作。不過,我的問題是,我想的xcodebuild的日誌通過管道輸送到stdoutphp -r "$code"

xcodebuild -scheme "<myscheme>" archive | tee >(php -r "$code" --) 

這也適用,生成日誌顯示,如果我改變php -r "$code" --php -r "$code" -- | cat,它記錄了.dSYM文件位置。

但是,下面不工作:

xcodebuild -scheme "<myscheme>" archive | tee >(dsym=$(php -r "$code" --)) 

#this one is the closest but is the wrong way around, 
#dsym = all the output, the filename is sent to stdout 
exec 5>&1 
dsym=$(xcodebuild -scheme "<myscheme>" archive | tee >(php -r "$code" >&5)) 

而且我不能讓我的頭周圍read -u X dsym作品或如何,就是要工作。有誰知道我怎麼會去:

  • 管道全部輸出到stdout
  • 管道全部輸出到中間程序/腳本(grep
  • 上述中間程序/腳本輸出存儲到一個變量

測試:保存文件scheme.out與取代

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nibh 
nulla, tempor nec dolor ac, eleifend imperdiet diam. Mauris tristique 
congue condimentum. Nullam commodo erat fringilla vestibulum tempus. 
Aenean mattis varius erat in venenatis. Donec eu tellus urna. Morbi 
lacinia vulputate purus, eu egestas tortor varius eget. Curabitur 
vitae commodo elit, vitae ullamcorper leo. 
Touch some_test_dsym_file.dSYM 
Nunc malesuada, nisi at ultricies lobortis, odio diam rhoncus urna, 
sed scelerisque enim ipsum eget quam. Nunc ut iaculis sem. Pellentesque 
massa odio, sodales nec lacinia nec, rutrum eu neque. Aenean quis neque 
magna. Nam quis dictum quam. Proin ut libero tortor. Class aptent taciti 
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
Vivamus vehicula fringilla consequat. Curabitur tincidunt est sed magna 
congue tristique. Maecenas aliquam nibh eget pellentesque pellentesque. 
Quisque gravida cursus neque sed interdum. Proin ornare dapibus 
dignissim. 

所需的輸出

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus nibh 
nulla, tempor nec dolor ac, eleifend imperdiet diam. Mauris tristique 
congue condimentum. Nullam commodo erat fringilla vestibulum tempus. 
Aenean mattis varius erat in venenatis. Donec eu tellus urna. Morbi 
lacinia vulputate purus, eu egestas tortor varius eget. Curabitur 
vitae commodo elit, vitae ullamcorper leo. 
Touch some_test_dsym_file.dSYM 
Nunc malesuada, nisi at ultricies lobortis, odio diam rhoncus urna, 
sed scelerisque enim ipsum eget quam. Nunc ut iaculis sem. Pellentesque 
massa odio, sodales nec lacinia nec, rutrum eu neque. Aenean quis neque 
magna. Nam quis dictum quam. Proin ut libero tortor. Class aptent taciti 
sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
Vivamus vehicula fringilla consequat. Curabitur tincidunt est sed magna 
congue tristique. Maecenas aliquam nibh eget pellentesque pellentesque. 
Quisque gravida cursus neque sed interdum. Proin ornare dapibus 
dignissim. 

echo $dsym

some_test_dsym_file.dSYM 
+0

要注意:因爲xcodebuild聯編往往掛起,如果任何錯誤發生了,我不能存儲xcodebuild'的'輸出,我需要輸出到顯示在蒼蠅 – Isaac

回答

1

您的代碼所需的輸出有很大的依賴性。我會說明我認爲你需要的東西,而不使用標準unix工具以外的任何東西。

這將運行一個命令,seq 4,併發送所有其輸出到標準輸出,並且也發送所有其輸出到另一個命令,sed 's/3/3-processed/',其輸出在一個變量中被捕獲,var

$ exec 3>&1 
$ var=$(seq 4 | tee >(cat >&3) | sed 's/3/3-processed/') 
1 
2 
3 
4 

爲了說明,我們成功地捕獲的sed命令的輸出:

$ echo "$var" 
1 
2 
3-processed 
4 

說明:var=$(...)捕獲文件句柄1(stdout)的輸出並將其分配給var。因此,爲了使輸出也出現在stdout上,我們需要將stdout複製到另一個文件句柄,然後$(...)重定向它。因此,我們使用exec將stdout複製爲文件句柄3.這樣,tee >(cat >&3)將命令的輸出既發送到原始標準輸出(現在稱爲3),也發送到文件句柄1,後者在流水線中的下一個階段傳遞。

因此,使用你的工具鏈,嘗試:

exec 5>&1 
dsym=$(xcodebuild -scheme "<myscheme>" archive | tee >(cat >&5) | php -r "$code") 
+1

我太親近了......我認爲我的腦袋混亂了文件描述符重定向。謝謝! – Isaac

相關問題