はじめに
シェルスクリプトを書いていて
予想外の失敗時に処理が先に進まないでほしい
場合に処理を中断してほしいことがありますよね。
そんなときのメモ
アジェンダ
どうやるか
-e
オプションをつけます。
-e
をつけることで、exit 0(正常ステータス)
以外が返る場合に処理を中止するようになります。
どう使うか
-e
オプションでの実行は何パターンかあります
具体例
サンプル
以下のようなシェルスクリプトサンプルで説明します。
- stop.sh
$ cat stop.sh #!/bin/bash echo "hoge" # あってる ehco "fuga" # echoをスペルミス echo "piyo" # あってる
- そのまま実行した場合
$ ./stop.sh hoge ./stop.sh: line 4: ehco: command not found piyo
line 4: ehco: command not found
とは表示されますが、
piyo
まで出力されています。
1. bashコマンドのオプションにつけてシェルスクリプトを実行する
シェルスクリプトの実行時にbashコマンド + -e
で実行します
$ bash -e stop.sh hoge stop.sh: line 4: ehco: command not found
piyo
が出力されずに処理が中断されました。
2. シェルスクリプトのshebangにつける
シェルスクリプトの冒頭に記載する#!/bin/bash
に-e
をつけます
stop.sh
を以下のように変更します
$ cat stop.sh #!/bin/bash -e echo "hoge" # あってる ehco "fuga" # echoをスペルミス echo "piyo" # あってる
- 実行
$ ./stop.sh hoge ./stop.sh: line 4: ehco: command not found
piyo
が出力されずに処理が中断されました。
3. シェルスクリプト内で"set -e"を呼ぶ
シェルスクリプトの冒頭でset -e
します。
stop.sh
を以下のように変更します
$ cat stop.sh #!/bin/bash set -e echo "hoge" # あってる ehco "fuga" # echoをスペルミス echo "piyo" # あってる
- 実行
$ ./stop.sh hoge ./stop.sh: line 4: ehco: command not found
アンチパターン
しかし、注意することがあります。
2. シェルスクリプトのshebangにつける
をbashコマンドで呼び出すとうまくいきません。
stop.sh
$ cat stop.sh #!/bin/bash -e echo "hoge" # あってる ehco "fuga" # echoをスペルミス echo "piyo" # あってる
- 実行
# そのまま実行 $ ./stop.sh hoge ./stop.sh: line 4: ehco: command not found # bashコマンドで呼び出し # piyoまで出力されてしまう $ bash ./stop.sh hoge ./stop.sh: line 4: ehco: command not found piyo
これだと意図せず中断したいから大丈夫だろうと思いつつ
意図せず続いてしまうのでだいぶむしろ怖いです。
3. シェルスクリプト内で"set -e"を呼ぶ
のほうは大丈夫です
$ cat stop.sh #!/bin/bash set -e echo "hoge" # あってる ehco "fuga" # echoをスペルミス echo "piyo" # あってる $ ./stop.sh ./stop.sh hoge ./stop.sh: line 6: ehco: command not found $ bash stop.sh hoge stop.sh: line 6: ehco: command not found
合わせて
おわり
set -e
は若干の賛否両論はありますが、
意図せず処理を続けることがないようにしたい場合は
シェルスクリプト内にset -e
するのが安心です\(^o^)/