"set -e": 実行コマンドが0以外の終了コードの場合、シェルスクリプトを終了する

by Stuck in Customs


「シェルスクリプトの実行過程でエラーが発生した場合に処理を止めたい」・・・それをすごくシンプル(簡単)に実現したい場合に使えます。


例えば、以下のようなシェルスクリプトを書いた場合、、、

#!/bin/sh

mkdir /tmp/hoge/fuga
touch /tmp/hoge/fuga/test.txt


実行結果は以下のようになります。

$ ./test.sh 
mkdir: ディレクトリ `/tmp/hoge/fuga' を作成できません: そのようなファイルやディレクトリはありません
touch: `/tmp/hoge/fuga/test.txt'にtouchできませんでした: そのようなファイルやディレクトリはありません

/tmp/hogeディレクトリが存在しないので、/tmp/hoge/fugaのmkdirでこけます。まぁ普通ですよね。。。
が、何も考えずに書くと、↑のように、その後のtouchまで実行しちゃうわけです。

"set -e"を実行した場合

#!/bin/sh

set -e
mkdir /tmp/hoge/fuga
touch /tmp/hoge/fuga/test.txt

上記のコードに対する実行結果は以下のようになります。

$ ./test.sh 
mkdir: ディレクトリ `/tmp/hoge/fuga' を作成できません: そのようなファイルやディレクトリはありません


"set -e"を実行した場合は、最初のmkdirの実行に失敗した(終了コード1)ため、その次のtouchが実行されずにシェルスクリプトが終了します。
つまり、"set -e"を付けることで、コマンド毎に(単純な)エラーチェックをする必要がなくなります。・・・が、各処理に対する細かいエラーハンドリングはできなくなります。

追記

ブックマークコメントで、man嫁とご指摘いただきましたので、追記します(上記、"細かい"、だけでは説明不足でしたね)。ご指摘ありがとうございました!
で、以下の場合においては、シェルは終了しません。(manより抜粋)

ただし失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または || リストの一部である、 コマンドの返り値が ! で反転されている、のいずれかの場合にはシェルは終了しません。


# しかしまぁ、これは余談ですけど、エントリを書いて1〜2時間で指摘のコメントをいただけるなんてありがたい、というかブログは凄いです。一人での勉強ではこうはいかない。ほんと勉強になります。


詳解 シェルスクリプト

詳解 シェルスクリプト