揮発性のメモ2

http://d.hatena.ne.jp/iww/

パイプの途中のエラーを取る

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にはどっちの機能も無いので自分でなんとかするしかない