出力をログファイルにリダイレクトするために、コマンド (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
シェル オプションオプションをオンに設定できます。
パイプラインの終了ステータスは、
pipefail
オプションが有効になっていない限り、パイプラインの最後のコマンドの終了ステータスになります ( Set 組み込みコマンドを参照)。pipefail
が有効になっている場合、パイプラインの戻りステータスは、ゼロ以外のステータスで終了した最後の (右端の) コマンドの値、またはすべてのコマンドが正常に終了した場合はゼロになります。
例:
$ false | tee /dev/null ; echo $?
0
$ set -o pipefail
$ false | tee /dev/null ; echo $?
1
元のパイプ設定を復元するには:
$ set +o pipefail