如何在陷阱命令后解开

时间:2015-07-03 07:57:51

标签: bash

我有一个错误陷阱如下:

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 似乎没有禁用陷阱。任何其他方式来解决问题"然后"重新陷阱" ?

4 个答案:

答案 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