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 を利用しているという情報はちゃんと追わないとダメだなと思った。

More