私のスクリプトは次のようになります。
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がうまくいったとき。私は破壊を求めたくありません。
トラップでこれを達成できますか?それは私のスクリプトではありません。少し変更する必要があります。たぶん、罠はここでは悪い呼びかけですか?
trap
の先頭を変更するだけで、最後のコマンド(exitの戻りコード、またはスクリプトの最後のコマンド)の戻りコードがゼロかどうかを確認できます。つまり.
trap '[ $? = 0 ] && exit;'"..."
ここで、"..."
は現在の文字列であり、間にスペースを入れずに続ける必要があります。トラップ内の出口は再びトラップされません。
トラップがシグナル(SIGINT(control-C)など)も処理している場合、トラップはSIGINTに対して1回呼び出され、次に出口に対してもう一度呼び出されます。 $?
は128+ nであり、nは信号であるため、SIGINTからトラップが呼び出されているかどうかを確認できます。SIGINTの場合は130です。 $?
は別のコマンドを実行するとすぐに変更されるため、おそらくrc=$?;
から始めて、テストで$rc
を使用してください。