如何在陷阱命令后解开

gex*_*tra 22 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
}
Run Code Online (Sandbox Code Playgroud)

我的代码中有一部分我预计会出现错误:

command1
command2
command3
set +e #deactivates error capture
command4_which_expects_error
set -e #re-activates error capture
command5
Run Code Online (Sandbox Code Playgroud)

总的来说,我需要在执行command4_which_expects_error时忽略陷阱

套+ E似乎并没有禁用的陷阱.任何其他"解开"然后"重新陷阱"的方法?

ped*_*ero 31

您可以在陷阱手册中找到以下内容:

KornShell使用ERR陷阱,只要set -e导致退出,就会触发该陷阱.

这意味着它不会被触发set -e,而是在相同的条件下执行.添加set -e陷阱的ERR执行陷阱后就会使你的脚本退出.

要删除陷阱,请使用:

trap - [signal]
Run Code Online (Sandbox Code Playgroud)

  • 只是强调一下,“信号”是可选的(这就是为什么它被放在方括号中)。我相信你可以使用“trap -”来删除所有陷阱。 (2认同)
  • KornShell,哪里提到了这个? (2认同)

anu*_*ava 8

您可以使用它trap来重置trap设置:

trap '' ERR
Run Code Online (Sandbox Code Playgroud)

  • `help trap` 表示使用 `''` 忽略,使用 `-` 重置为默认行为。 (22认同)

ti7*_*ti7 6

要忽略已知会失败的命令的失败,可以通过追加使行始终成功|| true

例:

#!/bin/bash

set -e

failed() {
    echo "Trapped Failure"
}
trap failed ERR

echo "Beginning experiment"
false || true
echo "Proceeding to Normal Exit"
Run Code Online (Sandbox Code Playgroud)

结果

#!/bin/bash

set -e

failed() {
    echo "Trapped Failure"
}
trap failed ERR

echo "Beginning experiment"
false || true
echo "Proceeding to Normal Exit"
Run Code Online (Sandbox Code Playgroud)

  • 为此,也可以使用[冒号/空实用程序](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html)(Ctrl-f“空实用程序”)::`它更短,并且具有不需要生成进程的优点,因为根据POSIX,“ true”通常是“ / bin / true”,而“:”始终是内置的。 (2认同)