gpt4 book ai didi

linux - Bash 陷阱从函数中取消设置

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:13 35 4
gpt4 key购买 nike

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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com