我有一个错误陷阱如下:
trap failed ERR
function failed {
local r=$?
set +o errtrace
set +o xtrace
echo "###############################################"
echo "ERROR: Failed to execute"
echo "###############################################"
# invokes cleanup
cleanup
exit $r
}
我的代码中有一部分我确实会遇到错误:
command1
command2
command3
set +e #deactivates error capture
command4_which_expects_error
set -e #re-activates error capture
command5
总的来说,我需要在执行 command4_which_expects_error
时忽略陷阱set + e 似乎没有禁用陷阱。任何其他方式来解决问题"然后"重新陷阱" ?
答案 0 :(得分:29)
您可以在陷阱手册中找到以下内容:
KornShell使用一个ERR陷阱,只要set -e导致退出就会触发。
这意味着它不是由set -e
触发,而是在相同的条件下执行。将set -e
添加到ERR上的陷阱将使您的脚本在执行陷阱后退出。
要删除陷阱,请使用:
trap - [signal]
答案 1 :(得分:5)
要忽略您知道将失败的命令失败,可以通过附加|| true
使该行始终成功。
示例:
#!/bin/bash
set -e
failed() {
echo "Trapped Failure"
}
trap failed ERR
echo "Beginning experiment"
false || true
echo "Proceeding to Normal Exit"
结果
Beginning experiment
Proceeding to Normal Exit
答案 2 :(得分:3)
您可以使用此trap
重置先前设置的trap
:
trap '' ERR
答案 3 :(得分:0)
要取消设置所有捕获的信号,可以循环运行“捕获-信号”:
trap | awk '{ print $NF }' | while read SIG ; do trap - $SIG ; done