Ubuntuでpipefailをbashを指定して使う
課題
command | original-filter
上記のような pipe をまたいだ shell script を CI で利用していたが、前段のコマンドの失敗を exit status として伝えることができておらず、CI は常に succeed 扱いになっていた。
command は fail しているのに original-filter は succeed なので常に succeed 扱い。
解決
【POSIX準拠】set -o pipefailを使おう!ただしdash、テメーはダメだ #ShellScript - Qiita
がすべてなのだが、
- 昨今、便利なクラウドは Ubuntu ベースが多く、今回の CI も Ubuntu なため、
/bin/sh
を shebang に指定したスクリプトは(恐らく)dash で動いており、上の指定は意図通り動作しない - ということで改修箇所は以下の通り。
# /bin/bash
set -o pipefail
感想
dash なぁ…。bash や zsh を標準にしたくないという気持ちは分からなくもないが、相変わらず Ubuntu は Debian という opinionated な distribution を利用しているという情報はちゃんと追わないとダメだなと思った。