コマンド出力をTeeにパイプし、コマンドの終了コードも保存する [重複] 質問する

コマンド出力をTeeにパイプし、コマンドの終了コードも保存する [重複] 質問する

出力をログファイルにリダイレクトするために、コマンド (mvn clean install) をラップするシェル スクリプトがあります。

#!/bin/bash
...
mvn clean install $@ | tee $logfile
echo $? # Does not show the return code of mvn clean install

mvn clean installがエラーで失敗した場合、ラッパー シェル スクリプトもそのエラーで失敗するようにします。ただし、すべての出力を tee にパイプしているため、 の戻りコードにアクセスできずmvn clean install、後でアクセスすると$?、常に 0 になります (tee は成功するため)。

コマンドにエラー出力を別のファイルに書き込ませて、後でそれを確認してみましたが、mvn のエラー出力は常に空です (stdout にのみ書き込まれるようです)。

戻りコードを保持しmvn clean installながら、出力をログファイルにパイプするにはどうすればよいでしょうか?

ベストアンサー1

必要な動作を得るには、pipefail シェル オプションオプションをオンに設定できます。

Bashリファレンスマニュアルより:

パイプラインの終了ステータスは、pipefailオプションが有効になっていない限り、パイプラインの最後のコマンドの終了ステータスになります ( Set 組み込みコマンドを参照)。pipefailが有効になっている場合、パイプラインの戻りステータスは、ゼロ以外のステータスで終了した最後の (右端の) コマンドの値、またはすべてのコマンドが正常に終了した場合はゼロになります。

例:

$ false | tee /dev/null ; echo $?
0
$ set -o pipefail
$ false | tee /dev/null ; echo $?
1

元のパイプ設定を復元するには:

$ set +o pipefail

おすすめ記事