「シェルスクリプトの実行過程でエラーが発生した場合に処理を止めたい」・・・それをすごくシンプル(簡単)に実現したい場合に使えます。
例えば、以下のようなシェルスクリプトを書いた場合、、、
#!/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時間で指摘のコメントをいただけるなんてありがたい、というかブログは凄いです。一人での勉強ではこうはいかない。ほんと勉強になります。
- 作者: Arnold Robbins,Nelson H. F. Beebe,日向あおい
- 出版社/メーカー: オライリージャパン
- 発売日: 2006/01/16
- メディア: 大型本
- 購入: 6人 クリック: 193回
- この商品を含むブログ (39件) を見る