シェルスクリプトを書くときはset -euしておく

  • 683
    いいね
  • 7
    コメント

1行目を

#!/bin/bash -eu

とするか、または、

set -eu

を書いておく。以下解説。

set -e

エラーがあったらシェルスクリプトをそこで打ち止めにしてくれる(exit 0以外が返るものがあったら止まるようになる)。「あっあれここでうまくいってないからデータ準備できてないのにあれあれっもうやめて!」ってなるのを防げる。

set -u

未定義の変数を使おうとしたときに打ち止めにしてくれる。Perlでいうuse strict 'vars';的なもの。

rm -rf $TMEP_DIR/

って気軽な気持ちで書いてしまって、「ん、やたら時間かかると思ったらスペルミスうわなにをするやめ」ってなるのを防げる。

一部だけ例外にしたい

はてなブックマークのコメントより

-e は command1 || command2 みたいなことが出来なくなるの使うことないな。-uは付けといて良いが。

確かにおっしゃるとおりですね。コマンドの失敗を考慮して書いている部分については(もしくはやたらexit 0以外するコマンドを呼ばないといけないときなど)、スクリプトの一部に限り -e を無効にしたいかもしれません。そんなときは以下のようにできます。こうするとエラーハンドリングを全部しっかり考えて作っていない限りは使わない意味はない気がします。

set -eu

# :
# do something
# :

# ここからは set -e を無効にする
set +e

command1 || command2

# ここからは再度有効にする
set -e

# :
# do something
# :