web-dev-qa-db-ja.com

トラップの「自然な」出口をスキップする

私のスクリプトは次のようになります。

trap "$(pwd)/dd-destroy.sh $l-env;$(pwd)/dd-drop.sh $l-db;exit" INT QUIT TERM EXIT

./dd-all.sh $l $l-db $l-env || exit 1

app_ip=$(./dd-status.sh ip $l-env|grep docker-app|awk '{print $3}')
url=http://$app_ip:8080/app/

wget -O /dev/null $url || (echo "access $url failed" && false) || exit 1

ここで、エラーが発生したときにこのトラップを起動する必要があります。これらの「exit1」(そこで変更できます)。しかし、dd-all.shのように何も起こらなかったとき、wgetがうまくいったとき。私は破壊を求めたくありません。

トラップでこれを達成できますか?それは私のスクリプトではありません。少し変更する必要があります。たぶん、罠はここでは悪い呼びかけですか?

2
Sarseth

trapの先頭を変更するだけで、最後のコマンド(exitの戻りコード、またはスクリプトの最後のコマンド)の戻りコードがゼロかどうかを確認できます。つまり.

trap '[ $? = 0 ] && exit;'"..."

ここで、"..."は現在の文字列であり、間にスペースを入れずに続ける必要があります。トラップ内の出口は再びトラップされません。

トラップがシグナル(SIGINT(control-C)など)も処理している場合、トラップはSIGINTに対して1回呼び出され、次に出口に対してもう一度呼び出されます。 $?は128+ nであり、nは信号であるため、SIGINTからトラップが呼び出されているかどうかを確認できます。SIGINTの場合は130です。 $?は別のコマンドを実行するとすぐに変更されるため、おそらくrc=$?;から始めて、テストで$rcを使用してください。

4
meuh