Bash 导出函数中的陷阱被悄悄忽略
此Bash脚本的行为与预期一致 测试这个。shBash 导出函数中的陷阱被悄悄忽略,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"
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