CIが失敗するのでgrepじゃなくsedを使う

2022-03-17  /  GitHub ActionsShell Script

ユースケースによるのですが、テキストのフィルターや検索は安直にgrepを使うもんでもないなと気付きました。

grep は検索条件に一致しないとエラーになる

正確には終了時のステータスが1になるので CI では失敗扱いになってしまいます。

Man page of GREP

通常では、選択される行が見つかったときの終了ステータスは 0 であり、 見つからなかったときは 1 であり、エラーが起きた場合は 2 です。

見つからなくてもステータスを0にするオプションはないようです。

もちろん見つからなかったら CI を止めたい場合には grep が良いでしょう。

sed で代替する

色々やり方はあると思うのですが、デフォルトでは非表示にして一致したら表示するコマンドで対応できそうです。

grep を使う例を変更します。

# condition に一致しなければステータス 1
dosomething | grep -E -e 'condition'

これをこのように書き換えます。

# condition に一致しなくてもステータスは 0
dosomething | sed -n -E -e '/condition/p'

-nはデフォルト出力をしないためのオプションです。/condition/ppが直前の条件に一致した行を表示するというコマンドになります。

この場合、一致するテキストがなくてもステータスは0で終了するので、つられて CI が失敗することもありません。