質問: ``` timeout 5 sleep 10 | tee -a LOG_FILE1 LOG_FILE2 RET=$? echo "$RET" ``` 上記のようにtimeoutコマンドを使用して終了ステータスの値によって処理を分岐させる実装していますが、 直でコマンドを実行した終了ステータスと shellスクリプト内でコマンドを実行した際で終了ステータスが異なる為、 期待した動作になりません。 直でコマンドを実行した終了ステータス:124 shellスクリプト内でコマンドを実行した終了ステータス:0 どうすればshellスクリプト内でコマンドを実行した際に終了ステータスを正しく取得できるのでしょうか?
回答: パイプの後半に`tee`コマンドを使用していますが、teeコマンドを挟むと終了ステータスを意図した通り拾えないケースがあるようです。 シェルスクリプトの中では終了ステータスを`$?`でチェックしていますが、代わりに`${PIPESTATUS}`を参照してみてください。 ``` #/bin/bash timeout 5 sleep 10 | tee -a LOG_FILE1 LOG_FILE2 RET=${PIPESTATUS[0]} echo "$RET" ``` 参考: teeでリターンコード拾えない問題 - Qiita なお、質問の例で実行しているコマンドで気になるのは、タイムアウトした場合プロンプトに表示される`Terminated`の文字は**標準エラー**に対してです。一方、`sleep`コマンド自体は画面に何も出力しないので、パイプ(リダイレクト)の前半の結果に関わらず`tee`コマンドには何も文字列が渡らない気がします。 `tee`コマンドの必要性がいまいち読み取れませんが、参考リンク先にもあるようにエラー出力もリダイレクト時にハンドリングする方法なども別解として考えられます。