Bash 导出函数中的陷阱被悄悄忽略

Bash 导出函数中的陷阱被悄悄忽略,bash,bash-trap,bash-function,Bash,Bash Trap,Bash Function,此Bash脚本的行为与预期一致 测试这个。sh function run_this() { trap "echo TRAPPED" EXIT false echo $? } run_this function run_this() { trap "echo TRAPPED" EXIT false echo $? } export -f run_this function run_this() { trap "echo LEAVING"

此Bash脚本的行为与预期一致

测试这个。sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
run_this
function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
export -f run_this
function run_this() {
    trap "echo LEAVING" RETURN
    trap "echo ERROR" ERR
    false
    echo $?
}
export -f run_this
它打印

1
TRAPPED
但是,当我尝试导出此函数时,它无法捕获

测试这2.sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
run_this
function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
export -f run_this
function run_this() {
    trap "echo LEAVING" RETURN
    trap "echo ERROR" ERR
    false
    echo $?
}
export -f run_this
在命令行中找到该源代码并运行它:

> source test_this2.sh
> run_this
导致

1

陷阱到哪里去了?

当您
导出该函数时,
陷阱将被忽略,因为当您
登录
外壳(函数导出到的地方)退出
时,不再有
外壳
可打印
陷阱
。(即,永远不会有
退出
,否则您将不再有shell。)当您
源代码测试时,您将在
登录shell
中执行它。当函数完成时,它将返回到您的
登录shell
--没有退出。当您运行
test\u this.sh
时,它将在
子shell
中执行,当
子shell
退出时,您将得到
捕获的
打印。如果您确实想查看退出时发生的情况,请尝试键入退出并查看发生的情况。

如果您想退出函数,请使用返回信号。 使用ERR信号来“捕获”错误,如您的“错误”呼叫

测试这个。sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
run_this
function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
export -f run_this
function run_this() {
    trap "echo LEAVING" RETURN
    trap "echo ERROR" ERR
    false
    echo $?
}
export -f run_this
加载并导出函数

source this_this.sh
测试一下

run_this
run_this
返回

ERROR
1
LEAVING
ERROR
1
LEAVING
启动子shell

bash
再次测试

返回

ERROR
1
LEAVING
ERROR
1
LEAVING
因此,出口运作良好

附言:我正在使用bash4.3.42