前のコマンドが成功した場合にのみ、一連のコマンドを順番に実行したいと思います。 ~によるとシェルスクリプト:エラー処理に「set -e」を使用するリスク:
次のように、「&&」を含む一連のコマンドを一緒にリンクして、エラーチェックを直接実行することをお勧めします。
mkdir abc && cd abc && do_something_else && last_thing || { echo error >&2; exit 1; }
特定のコマンド(ループまたは複雑な条件など)の間にいくつかのスクリプトロジックがある必要がある状況では、状態を変数にキャプチャしてから、その変数を再利用して前のコマンドが実行された場合に他のコマンドのみを実行する慣用的な方法は何ですか? ?コマンドが成功しましたか?
それは次のとおりです。
mkdir abc
status=$?
... # do stuff (which might alter $?)
$status && cd abc
status=$?
... # do more stuff
$status && do_something_else
status=$?
... # do even more
$status && last_thing
status=$?
... # do final stuff
$status || { echo error >&2; exit 1; }
ベストアンサー1
OP自体が提供した答えの少しクリーンなバージョンは次のとおりです。
bail() {
return=${1-1} # if no parameters sent, default to exit code 1
shift
echo "$@" 1>&2
exit $return
}
if mkdir abc; then
do_stuff
else
bail 1 "Unable to create directory"
fi
if cd abc; then
do_stuff
else
bail 2 "Unable to enter directory"
fi
# et cetera
重要なのは、各障害事例に固有の終了コードを提供することであり、この構成を使用すると、トリガーの前に各セクションelse
で独自の障害事例管理を実行することもできますbail()
。