51378

[code]

    timeout 5 sleep 10 | tee -a LOG_FILE1 LOG_FILE2
    RET=$?
    echo "$RET"
    
[/code]

上記のようにtimeoutコマンドを使用して終了ステータスの値によって処理を分岐させる実装していますが、  
直でコマンドを実行した終了ステータスと  
shellスクリプト内でコマンドを実行した際で終了ステータスが異なる為、  
期待した動作になりません。  
直でコマンドを実行した終了ステータス：124  
shellスクリプト内でコマンドを実行した終了ステータス：0

どうすればshellスクリプト内でコマンドを実行した際に終了ステータスを正しく取得できるのでしょうか？


CC BY-SA 4.0
2018-12-19T07:02:29.923
51346
2018-12-20T05:25:56.507
31179
question
linux bash
bashのtimeoutコマンドをshellスクリプトから実行すると終了ステータスが正しく取得できない


パイプの後半に`tee`コマンドを使用していますが、teeコマンドを挟むと終了ステータスを意図した通り拾えないケースがあるようです。

シェルスクリプトの中では終了ステータスを`$?`でチェックしていますが、代わりに`${PIPESTATUS}`を参照してみてください。

[code]

    #/bin/bash
    timeout 5 sleep 10 | tee -a LOG_FILE1 LOG_FILE2
    RET=${PIPESTATUS[0]}
    echo "$RET"
    
[/code]

参考:  
[teeでリターンコード拾えない問題 -
Qiita](https://qiita.com/kugyu10/items/cee6a461c3bab063c947)

* * *

なお、質問の例で実行しているコマンドで気になるのは、タイムアウトした場合プロンプトに表示される`Terminated`の文字は **標準エラー**
に対してです。一方、`sleep`コマンド自体は画面に何も出力しないので、パイプ(リダイレクト)の前半の結果に関わらず`tee`コマンドには何も文字列が渡らない気がします。

`tee`コマンドの必要性がいまいち読み取れませんが、参考リンク先にもあるようにエラー出力もリダイレクト時にハンドリングする方法なども別解として考えられます。


CC BY-SA 4.0
2018-12-20T05:25:56.507
51378
2018-12-20T05:25:56.507
3060
51346
answer