課題
シェルスクリプトは、途中のコマンドでエラーが発生してもその場では終了せず、なおかつシェルスクリプト自体の終了ステータスも 0 (正常終了)
です。
例えば、次のシェルスクリプトは、途中の false
コマンドがエラーを返しますが、最後の echo "[Finish]"
が実行されており、終了ステータスも 0 (正常終了)
となっています。
test1.sh
#!/bin/bash
false
echo "[Finish]"
$ ./test1.sh; echo $?
[Finish]
0
これは正しい挙動ですが、場合によっては
- どこかでエラーが発生したら、その場で止まってほしい
- 終了ステータスも 0 以外を返してほしい
ということもあります。
以下で解決策を挙げます。
解決策
1. shebang に -e オプションをつける
test2.sh
#!/bin/bash -e
false
echo "[Finish]"
$ ./test2.sh; echo $?
1
途中で異常終了 ( 期待通り )
2. set -e コマンド
test3.sh
#!/bin/bash
set -e
false
echo "[Finish]"
$ ./test3.sh; echo $?
1
途中で異常終了 ( 期待通り )