次のスニペットを検討してください。
stop () {
echo "${1}" 1>&2
exit 1
}
func () {
if false; then
echo "foo"
else
stop "something went wrong"
fi
}
通常、呼び出されるとfunc
スクリプトは終了し、これは予想される動作です。ただし、サブシェルで実行される場合は次のようになります。
result=`func`
スクリプトを終了しません。これは、呼び出しコードが毎回関数の終了状態をチェックする必要があることを意味します。これを避ける方法はありますか?これがset -e
目的ですか?
ベストアンサー1
たとえば、終了ステータス77を設定して、任意のレベルのサブシェルを終了して実行できます。
set -E
trap '[ "$?" -ne 77 ] || exit 77' ERR
(
echo here
(
echo there
(
exit 12 # not 77, exit only this subshell
)
echo ici
exit 77 # exit all subshells
)
echo not here
)
echo not here either
set -E
ERR
この改善されたバージョンはトラップと組み合わせて、set -e
ユーザーが自分のエラー処理を定義できるようにします。
zshではERRトラップが自動的に継承されるため、必要はありません。トラップを関数として定義し、次のように変更することもできset -E
ます。TRAPERR()
$functions[TRAPERR]
functions[TRAPERR]="echo was here; $functions[TRAPERR]"