コマンドの前の最後の終了コードは何ですか? [コピー]

コマンドの前の最後の終了コードは何ですか? [コピー]

私は release.sh と caller.sh (caller.sh が release.sh を呼び出す) スクリプトを実行しています。どちらもバッシュです。

release.sh には、エラーを示す「exit 1」とともに複数の条件が含まれています。

caller.shには「./release.sh」行が含まれており、release.shの終了コードを確認してください。 $?が0より大きい場合は、echo "release.sh messed up"と終了します。

./release.sh
        if [ $? -gt "0" ] ; then
            echo "release_manager exited with errors, please see the release log."
            exit 1
        else 
            echo "release manager is done." 
        fi

私は最近release.shを文書化することにしましたので、caller.shの行は次のようになります。

./release.sh 2>&1 | tee release.txt

パイプのために$?は「tee release.txt」の終了コードで、前のコマンドに関係なく常に0を表示します。 :-(

release.shエラーを確認し、呼び出し元が続行しないようにする必要がありますが、そのログも必要です。

コマンドの終了コードを取得する方法はありますか?今後最後?または、同じコマンドで公開スクリプトを別の方法で記録しますか?

私はrelease.shの責任を負いませんし、それを変更したくありません。

答え1

Bashを使用しているので、スクリプトでオプションを設定できます。

set -o pipefail

パイプの戻り状態は、ゼロ以外の状態で終了した最後の(最も右側の)コマンドの値、またはすべてのコマンドが正常に終了した場合は0です。

あるいは、パイプラインコマンドの直後に、${PIPESTATUS[0]}パイプラインの最初のコマンド終了コードの組み込み変数値を表示することもできます。

PIPESTATUS:フォアグラウンドパイプラインで最後に実行されたプロセスの終了ステータス値のリストを含む配列変数(単一のコマンドのみを含めることができます)。

答え2

次のように書き直すことをお勧めします。

./release.sh > release.txt 2>&1

それから

echo $?

正しい終了ステータスを返します

関連情報