web-dev-qa-db-ja.com

Teeはパイプから全体の出力を取得しません

次のようなコマンドを実行するスクリプトがあります。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

問題は、おそらくteeへのパイプにあります。全体の出力を取得していないようです。アプリケーションが終了すると、出力の最後の数行(通常、致命的なエラーを含む行)が失われます。 teeへのパイプなしでアプリを実行すると、出力に表示されます。

Teeがすべての出力の処理を完了するのをスクリプトに強制させるにはどうすればよいですか?

10
Ladislav Mrnka

致命的なエラーはおそらく、STDOUT(1)ではなく、STDERR(2)で発生しています。 2>&1を使用してSTDERRをSTDOUTにリダイレクトすると、パイプもそれをキャプチャする必要があります。

./some_app -i $INDEX 2>&1 | tee $LOG

バッファリングの問題がある場合は、強制的にバッファリングされていない状態にすることができます。

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG
20
Oli

エラーメッセージは通常STDERR(ファイル記述子2)に表示されるため、STDOUTとSTDERRの両方をteeにリダイレクトする必要があります。

./some_app -i "$INDEX" |& tee "$LOG"

./some_app -i $INDEX | tee $LOGを実行すると、STDOUTはteeにのみリダイレクトされます。

|&は、STDOUTとSTDERRの両方をリダイレクトします。

STDOUTのみをリダイレクトできない場合(以前と同様):

./some_app -i "$INDEX" | tee "$LOG"

一方、STDERRのみをリダイレクトする場合:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
5
heemayl