2016-06-14 4 views
1

に続い命令するが、私のビルドコマンドのいずれかがある:パイプstdoutに出力し、変数

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") 
を取得する必要があります

これは動作します。しかし、私の問題があり、私はstdoutphp -r "$code"

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

これはまた、ビルドログのショーを動作し、私はphp -r "$code" -- | catからphp -r "$code" --を変更した場合、それは.dSYMファイルの場所をログにパイプさxcodebuildのログを希望します。

しかし、以下では動作しません:

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作品や仕事ができることを意図しているのまわりで私の頭を取得することができません。私は行くだろうか誰か知っています:

  • パイピング中間プログラム/スクリプト(grep
  • 変数
  • に上記中間プログラム/スクリプトの出力を保存する
  • 配管にすべての出力をstdoutにすべての出力を

テストするには:ファイルscheme.outを保存し、でxcodebuild...を置き換えます

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

あなたのコードの

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. 

所望の出力は、依存関係をたくさん持っています。私は、あなたが標準的なUNIXツールを超えて何も使用せずに必要と考えるものを説明します。

これは、コマンドを実行seq 4、およびstdoutにその出力の全てを送信し、別のコマンド、sed 's/3/3-processed/'、変数に捕捉された出力、varその出力の全てを送信する:

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

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

説明:var=$(...)

は、私たちが成功しsedコマンドの出力をキャプチャすることを説明するために、ファイルハンドル1(stdout)の出力をキャプチャし、varに割り当てます。したがって、出力をstdoutにも表示するには、stdoutを別のファイルハンドルに複製してから、$(...)をリダイレクトする必要があります。したがって、execを使用してstdoutをファイルハンドル3として複製します。このようにして、tee >(cat >&3)は、元のstdout(現在は3と呼ばれています)と、パイプラインの次の段階で渡されるファイルハンドル1の両方にコマンドの出力を送ります。

だから、あなたのツールチェーンを使用して、試してみてください。

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

私はとても近かった...私は私の頭がファイル記述子のリダイレクトを混乱させると思う。ありがとう! – Isaac

関連する問題