Bash でパイプを使ってコマンドを実行すると 終了ステータスは、最後のコマンドの結果になります。
たとえば次のような場合
$ true | false | true
間に false (終了ステータス 1)があるのですが $? で確認すると 0 になっています。
$ true | false | true $ echo $? 0
これは 最後の true の終了ステータスが 0 のためなのですが これでは途中にエラーがあったかどうかわかりません。
・・・と、長らく思っていたのですが、以下のサイトに方法が書いてありました。
[参考]
終了ステータス - UNIX & Linux コマンド・シェルスクリプト リファレンス
Bash の特殊変数 $PIPESTATUS に入るそうです。
$ true | false | true $ echo ${PIPESTATUS[@]} 0 1 0 $ exit 3 | exit 12 | exit 0 $ echo ${PIPESTATUS[@]} 3 12 0
配列の形で入るので、これを使えばパイプ中のコマンドの終了ステータスも 確認することができますね。