2012-08-01 102 views
15

スクリプトの出力を別のプログラムにリダイレクトしたい。何か私は通常、これらの二つの形式を使用して行うだろう:Makefileルール内のstdoutとstderrのリダイレクト

[Makefile] 
test: 
    python test.py 2>&1 | pyrg [doesn't work] 

は、私が仕事をしてスクリプトファイルを書く避けたい:

python test.py 2>&1 | pyrg 
python test.py |& pyrg 

私の問題は、それがメイクファイル内から動作しないということです。

編集:

これはpyrg問題のように思える:私はテストが失敗した場合にcat部分を取得することはありませんよう

python test.py 2>&1 | tee test.out // Writes to the file both stderr and stdout 
cat test.out | pyrg    // Works fine! 
python test.py 2>&1 | pyrg   // pyrg behaves as if it got no input 

これは私にとって悪いソリューションです(すべてがありますMakefileルールの中で)

+4

これは動作するはずです。 'make 'は解釈のために'/bin/sh'に行全体を渡すので、このシェル(あなたのユーザシェルである必要はありません)が作品を理解することができます。 –

+2

それはどうしてうまくいかないのですか?あなたのmakefileのどこかに 'export SHELL:=/bin/bash'を設定してみてください。 –

+0

2番目のコマンドは、 'stdin'から何も入力されなかったかのように動作します。そして実際には最初のものの前に実行されます。 '|'の代わりに '||'を使うと順序が維持されますが、 'pyrg'は入力を受け付けません。 – Xyand

答えて

3

簡単なアプローチがうまくいかない理由は説明しませんが、それはトリックです:

[Makefile] 
test: 
    python test.py >test.out 2>&1; pyrg <test.out 
8

私は同じ問題でこの質問に遭遇し、答えに満足しませんでした。私はテストケースexample2.TLBNで失敗したバイナリTLBNを持っていました。

これは、私のmakeファイルが最初に見たものです。

make: 
    ./TLBN example2.TLBN > ex2_output.txt 

エラーメッセージが表示されずに失敗しました。メークプロセスが予期して停止していました。

これは私の修正です:

make: 
    -./TLBN example2.TLBN > ex2_output.txt 2>&1 

はstderrに任意の出力を無視して作るよう指示行の先頭に-に注意してください。

これは、同様の問題を抱えている人に役立ちます。

関連する問題