bash3.2.25とbash4.1.5で実験
参考:http://mlog.euqset.org/archives/linux-users/106994.html
システム変数PIPESTATUSを使う
$ (exit 1) | (exit 0) | (exit 3) | (exit 0) $ echo ${PIPESTATUS[@]} 1 0 3 0
PIPESTATUSという配列に、最後にパイプ使ったときの各コマンドの終了コードが入ってる
pipefailオプションを使う
$ set -o pipefail $ (exit 1) | (exit 0) | (exit 3) | (exit 0) $ echo $? 3
pipefailオプションを使うと、各コマンドで最後にゼロ以外だった終了コードが返る
set -eと組み合わせて使うと、途中のコマンドがエラーだったときにもちゃんと死ぬようになる
元に戻すときは set +o pipefail
pipefailはbash3.0以降にしかない
dashにはどっちの機能も無いので自分でなんとかするしかない