トラップで「自然な」出口をスキップ

トラップで「自然な」出口をスキップ

私のスクリプトは次のとおりです

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

「exit 1」(ここで変更できます)エラーが発生した場合は、このトラップを開始したいと思います。しかし、何も起こらないと、dd-all.shはうまくいき、wgetはうまくいきます。私は破壊を要求したくありません。

これを行うためにトラップを使用できますか?これは私のスクリプトではないので、少し変更する必要があります。ここでトラップが間違った選択ではないでしょうか?

答え1

先頭を変更して、trap最後のコマンドの戻りコード(終了の戻りコードまたはスクリプトの最後のコマンド)がゼロであることを確認してください。つまり

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

現在の文字列はどこに"..."ありますか?その後にスペースがあってはいけません。トラップから抜け出すと、トラップに落ちるのを防ぐことができます。

トラップがSIGINT(control-C)などの信号も処理する場合、トラップはSIGINTに対して一度呼び出され、終了するために再度呼び出されます。トラップが SIGINT から呼び出されることを確認できます。$?128+nになります。ここで、nは信号なので、SIGINTは130です。$?他のコマンドを実行すると変更が発生するため、そのコマンドで開始してテストに使用できますrc=$?;$rc

関連情報