单语句子外壳在使用时似乎没有继承 ERR 陷阱"set -o errtrace"



考虑这个最小的示例,我将其作为可执行文件运行。

#!/bin/bash
set -E
trap 'echo "ERR trap triggered"' ERR
(
echo "hello" >/dev/null
ls /root/
)

请注意以下输出中的两个 ERR 陷阱消息:

ls: cannot open directory '/root/': Permission denied
ERR trap triggered
ERR trap triggered

但是,当我使子外壳包含单个语句时,例如:

#!/bin/bash
set -E
trap 'echo "ERR trap triggered"' ERR
(
ls /root/
)

我只收到一条 ERR 陷阱消息:

ls: cannot open directory '/root/': Permission denied
ERR trap triggered

我希望有人能向我解释输出差异背后的原因。 谢谢!

我正在回答我自己的关闭问题。

发生这种情况的原因是,Bash 在某些情况下不会创建子 shell,以尝试优化。 Bash 不会创建子外壳的一种情况是在 OPs 的情况下,其中子外壳包含单个简单命令。

这是一个StackExchange问题,他的答案提供了有关这种Bash行为的更多详细信息。

至于文档,我将重复 Stackexchange 答案中的内容。 我能找到的关于此行为的唯一文档是这里的 Bash 源文件

最新更新