![跳过陷阱中的“自然”出口](https://linux22.com/image/74213/%E8%B7%B3%E8%BF%87%E9%99%B7%E9%98%B1%E4%B8%AD%E7%9A%84%E2%80%9C%E8%87%AA%E7%84%B6%E2%80%9D%E5%87%BA%E5%8F%A3.png)
我的脚本如下所示:
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