メモの日々


2006年02月16日(木) [長年日記]

[unix][shell] エラーになったらシェルスクリプトを終了させる

以前

今日はシェルスクリプトにちまちまとエラー処理を追加したりとかしてた。

と書いたが、これはスクリプト内の各実行コマンドに対して

if ! コマンド; then
    exit 1
fi

のように、処理が失敗したらexitする、という処理をいちいち追加していたのだ。こうしないと、コマンドがエラーになってもスクリプトの処理が先へ進んでしまうから。

コマンドがエラーになったらスクリプトも止まるようにする設定があるはずだとは思っていたが、このときは設定方法が分からなかった。で、今日

set -e

とすればいいみたい、ということを知ったのでメモ。

bashのmanのsetの項より引用:

-e

単純なコマンド (前述の シェルの文法 セクションを参照) が 0 でないステータスで終了した場合、即座に終了します。ただし失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または || リストの一部である、コマンドの返り値が ! で反転されている、のいずれかの場合にはシェルは終了しません。

(追記)

うーん、set -e と書いたスクリプト内に多値を返すコマンドがあるとうまく動かないなあ。エラーではなくても0以外の戻り値を返すことがあるので、そのときスクリプトが止まってしまう。

うまく書けないので、多値を返すコマンドの前後では「set +e」「set -e」とすることで凌ぐ。

やること

  • 決算
  • カレンダーを買う