跳过陷阱中的“自然”出口

跳过陷阱中的“自然”出口

我的脚本如下所示:

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 则工作正常。我不想呼吁摧毁。

我可以用 trap 来完成这个任务吗?这不是我的剧本,我需要稍微修改一下。也许陷阱在这里是一个错误的选择?

答案1

只需更改您的开头trap即可检查最后一个命令的返回代码(这将是退出的返回代码,或脚本末尾的命令)是否为零。 IE

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

其中"..."是您当前的字符串,后面应该没有空格。陷阱内的出口不会再次陷入陷阱。

如果陷阱还处理信号,例如 SIGINT (control-C),则陷阱将针对 SIGINT 调用一次,然后再次调用退出。您可以检查是否从 SIGINT 调用 trap,因为它将$?是 128+n,其中 n 是信号,因此 SIGINT 为 130。请记住$?,一旦您发出另一个命令,就会发生变化,因此也许可以先开始,然后在测试中rc=$?;使用。$rc

相关内容