モヒカンは正義

渋谷で働く怪しいWebエンジニアの生きた証と備忘録

`set -e` していても `command1 || command2` みたいな書き方ができる #些細な検証メモ

f:id:pinkumohikan:20170611154955p:plain

ことのはじまり

シェルスクリプトを書くときに set -e しますよね

これをしておくとシェルスクリプトの途中でエラーが発生した場合に処理を中断してくれるので、ある処理が失敗したあと、意図せず後続の処理が動いて悲劇が起こるのを防いてくれます

ところが先日、 「set -eしちゃうと、command1 || command2 みたいな書き方が出来なくてアレ」 みたいな記事を目にしたので、そんなことあらへんやろと検証してみました (100%の自信はなかったので、念のためにw)

結論

set -e していても command1 || command2 みたいな書き方ができる

検証

下記のようなそれっぽいスクリプトを用意して

set -ex

echo 'hoge'

# ここで中断されずに `echo 'yay'` が実行されて欲しい
mkdir /home || echo 'yay'

# ここで非ゼロexit codeとなるので、中断されるはず
mkdir /tmp

# ここまで行くと行き過ぎ
echo 'Error! Should not be call this line!' && exit 1

動かすと、、、

$ bash hoge.sh
+ echo hoge
hoge
+ mkdir /home
mkdir: cannot create directory ‘/home’: File exists
+ echo yay
yay
+ mkdir /tmp
mkdir: cannot create directory ‘/tmp’: File exists

最初のmkdirに失敗しても、or実行しているechoに成功しているので 中断されていません もちろん、2度目のmkdirでは普通に非ゼロのexitとなったので中断されました

上記の検証で、 set -eしている状態で前者のor演算が失敗しても処理は中断されない ことがハッキリしたので、set -e していても臆せず command1 || command2 みたいな書き方ができますね

アイキャッチ画像は いらすとや からお借りしました