http://fvue.nl/wiki/Bash:_Error_handling#Set_ERR_trap_to_exit

为什么必须使用set -o errtrace来使陷阱设置/从函数调用取消设置起作用?

#!/usr/bin/env bash

function trapit {
    echo 'trapped in a box'
}

function setTrap {
    trap 'trapit' ERR
}

function unsetTrap {
    trap - ERR
}

function foo_init {
    fooOldErrtrace=$(set +o | grep errtrace)
    set -o errtrace
    trap 'echo trapped' ERR   # Set ERR trap
}

function foo_deinit {
    trap - ERR                # Reset ERR trap
    eval $fooOldErrtrace      # Restore `errtrace' setting
    unset fooOldErrtrace      # Delete global variable
}

# foo_init
setTrap
echo 'set'
false

echo 'unset'
#foo_deinit
unsetTrap
false

最佳答案

根据man bash(5)的说法,在未打开errtrace标志的情况下,函数不会继承ERR陷阱。我不知道为什么默认情况下不能继承ERR陷阱,但是...现在是这样:)

您可以使用我的示例代码测试此行为:

#!/usr/bin/env bash
trapit ()  {
 echo 'some error trapped'
}

doerr1 () {
 echo 'I am the first err generator and i return error status to the callee'
 return 1
}

doerr2 () {
 echo 'I am the second err generator and i produce an error inside my code'
 fgrep a /etc/motttd
 return 0
}

[[ $1 ]] && set -o errtrace

trap trapit ERR

doerr1

doerr2

echo 'We will produce an exception in the main program...'
cat /etc/ftab | fgrep a

echo 'OK, thats done, you see it :)'

如果将任何参数传递给此脚本,则errtrace标志将打开,并且当doerr2尝试执行糟糕的操作时,您将看到该异常已“捕获”。

关于linux - bash 陷阱未设置功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29411280/

10-12 23:48