web-dev-qa-db-ja.com

Makefileルール内のstdoutとstderrのパイピング

スクリプトの出力を別のプログラムにパイプしたい。私が通常これらの2つの形式を使用して行うこと:

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

私の問題は、メイクファイル内からは機能しないことです。

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

仕事をするスクリプトファイルを書くのは避けたいです。

編集:

これはpyrgの問題のようです:

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

テストが失敗した場合にcatの部分に到達することはないため、これは私にとって悪い解決策です(すべてがMakefileルール内にあります)

20
Xyand

単純なアプローチが機能しない理由は説明されていませんが、トリックはあります。

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

私は同じ問題でこの質問に出くわし、答えに満足しませんでした。テストケースexample2.TLBNで失敗したバイナリTLBNがありました。

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

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

これは、私が予期していたエラーメッセージで失敗し、makeプロセスを停止しました。

これは私の修正です:

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

Stderrへの出力を無視するようにmakeに指示する行の先頭にある-に注意してください。

これが同様の問題を抱えている人に役立つことを願っています。

8
Lucas

不思議なことに、私は同じ問題を抱えていて、次のように解決しました:

check-errors:
    check-for-errors.sh &> errors.txt

なぜ2>&1 >errors.txtここでは機能しませんでしたが、&> した

0
user5359531