前のコマンドが成功した場合にのみ、一連のコマンドを順番に実行したいと思います。 ~によるとシェルスクリプト:エラー処理に「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()
。
答え2
この質問を書いたとき、考えられる解決策の1つは次のとおりです。
mkdir abc || { echo error >&2; exit 1; }
... # do stuff (which might alter $?)
cd abc || { echo error >&2; exit 1; }
... # do more stuff
do_something_else || { echo error >&2; exit 1; }
... # do even more
last_thing || { echo error >&2; exit 1; }
... # do final stuff
この場合、$status
変数は必要なく、前のコマンドが成功した場合にのみコマンドが実行されます。また、die "error message"
エラーメッセージをエコーし、エラーコードで終了する機能が役に立つかもしれません。
修正する
そしてdie
、これは〜になります:
die() { echo "$*" >&2; exit 1; }
mkdir abc || die "error"
... # do stuff
cd abc || die "error"
... # do more stuff
do_something_else || die "error"
... # do even more
last_thing || die "error"
... # do final stuff