Linux 从函数中取消Bash陷阱
即 为什么必须Linux 从函数中取消Bash陷阱,linux,bash,terminal,Linux,Bash,Terminal,即 为什么必须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 err
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 trap。我不知道为什么错误陷阱不能默认继承,但是。。。现在是这样:)
您可以使用我的示例代码测试此行为:
#!/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试图做一些糟糕的事情时,异常被“捕获” 困扰我的是,从函数设置的陷阱设置在全局范围内,但不能以相同的方式取消设置。您可以全局设置某些内容,但不能以相同的方式取消设置。我想知道为什么。