1

此 Bash 脚本按预期运行。

test_this.sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
run_this

它打印

1
TRAPPED

但是,当我尝试导出此功能时,它无法捕获。

test_this2.sh

function run_this() {
    trap "echo TRAPPED" EXIT
    false
    echo $?
}
export -f run_this

在命令行中获取并运行它:

> source test_this2.sh
> run_this

结果是

1

陷阱去哪儿了?

4

2 回答 2

1

当您使用函数时,将trap被忽略,export因为当您exitlogin外壳(函数导出到的位置)时,不再有 ashell可打印trapped。(即永远不会有一个,exit否则您将不再有外壳。)当您source test_this2.sh,你在你的login shell. 当函数完成时,它会返回到你的login shell--没有退出。当你运行时test_this.sh,它在 a 中执行subshell,当subshell退出时,你会被trapped打印出来。如果您真的想看看exitlogin shellexit.

于 2014-11-26T02:06:45.750 回答
1

如果您想“陷阱”离开函数,请使用 RETURN 信号。使用 ERR 信号来“捕获”错误,例如您的“错误”调用。

test_this.sh

function run_this() {
    trap "echo LEAVING" RETURN
    trap "echo ERROR" ERR
    false
    echo $?
}
export -f run_this

加载和导出函数

source this_this.sh

测试一下

run_this

返回

ERROR
1
LEAVING

启动子shell

bash

再次测试

run_this

返回

ERROR
1
LEAVING

所以导出工作正常。

PS:我正在使用 bash 4.3.42

于 2016-04-11T09:36:38.207 回答