There's an echo in my head

日々のメモ。

pipeの途中でエラーが起きたタイミングでエラーを返す

パイプを繋げたときの返り値は最後のコマンドの返り値になる。

例えば

stat = system "a | b |c"

としたとき、途中でaやbがエラーになっても返り値statはfalseにならずcの返り値であるtrueになる。 cがエラーに成った時にはfalseになる。*1

これだとパイプの途中でエラーが起きた場合に捕捉できない。

そういうときはbash-o pipefailオプションを使う。*2 これを指定するとパイプの途中でエラーが起こった時にはそのときの返り値が、なにも起きなければ最後のcの返り値が全体の返り値が返ってくるようになる。 さらに-eを付けておくことでエラーが起きたタイミングで終了するようになる。

stat = system %{bash -e -o pipefail -c "a | b | c"}

参考

*1:具体的な返り値は個々のコマンドの実装依存なので、エラーになってもtrueを返すやつがいるかもしれない

*2:bash 3.0から。zshも5.0以降で実装されてるらしい

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。