次のようなコマンドを実行するスクリプトがあります。
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がすべての出力の処理を完了するのをスクリプトに強制させるにはどうすればよいですか?
致命的なエラーはおそらく、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
エラーメッセージは通常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"