考虑这个最小的示例,我将其作为可执行文件运行。
#!/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 源文件