エラー発生時に即座に終了する (set -e)
コマンドの実行に失敗した時点でスクリプトを終了させます。
set -e
false
echo "実行されません"
デフォルト(+e)では、失敗しても後続の処理が継続されます。
set +e
false
echo "実行されます"
未定義の変数をエラーにする (set -u)
定義されていない変数を参照しようとした場合にエラーにして終了させます。
set -u
echo "${undefined_var}"
デフォルト(+u)では、未定義の変数は空文字として扱われます。
set +u
echo "value: [${undefined_var}]"
パイプラインのエラーを検知する (pipefail)
デフォルトでは、途中のコマンドが失敗しても最後のコマンドが成功すれば終了ステータスは 0 になります。
set +o pipefail
false | echo "output"
echo "exit status: $?"
pipefail を有効にすると、途中の失敗が終了ステータスに反映されます。パイプライン自体の実行は継続されます。
set -o pipefail
false | echo "output"
echo "exit status: $?"
終了時に実行する処理 (trap EXIT)
正常終了、異常終了を問わず、スクリプトが終了する際に必ず実行したい処理を登録します。
trap 'echo "cleanup"' EXIT
false
エラー発生時に実行する処理 (trap ERR)
コマンドが失敗した際に行番号を表示するなど、デバッグに利用できます。
trap 'echo "Error on line $LINENO"' ERR
false
echo "exit status: $?"
コマンドが成功した場合は、トラップした処理は実行されません。
trap 'echo "Error on line $LINENO"' ERR
true
echo "exit status: $?"
エラーを無視して続行する
set -e が有効な場合でも、特定のコマンドの失敗を許容したい場合は || : などを記述します。
set -e
ls /nonexistent || :
echo "続行されます"