【发布时间】:2019-03-23 01:49:35
【问题描述】:
针对 Bash 5.0.2 测试
Bash 通过在子shell 环境中执行[the] 命令来执行[命令替换] 的扩展
根据The Open Group Base Specifications Issue 6:
当进入一个子shell时,未被忽略的陷阱被设置为默认动作。
所以在运行以下脚本时:
function a {
trap -p EXIT
}
trap "echo 'parent'" EXIT
echo "$(a)"
(a)
trap - EXIT
echo 'exiting'
...我希望输出:
exiting
...但我得到了:
trap -- 'echo '\''parent'\''' EXIT
trap -- 'echo '\''parent'\''' EXIT
exiting
... 意味着函数 a - 即使它在子 shell 中运行 - 正在查看父 shell 的陷阱命令(通过 trap -p)但不执行它们。
这是怎么回事?
【问题讨论】:
-
您似乎使用的是 bash 3.2;如果有的话,
bash的更高版本会朝相反的方向移动,对echo "$(a)"和(a)执行陷阱。 (在当前版本 5.0.3 中仍然如此。) -
我针对 Bash 3.2.57 和 Bash 5.0.2 进行了测试。对我来说结果相同。
-
嗯,我在 3.2.37 中没有看到
(a)的继承陷阱。
标签: bash subshell command-substitution bash-trap