【发布时间】:2020-10-19 00:37:46
【问题描述】:
考虑这个我作为可执行文件运行的最小示例。
#!/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
但是,当我让 subshell 包含单个语句时,例如:
#!/bin/bash
set -E
trap 'echo "ERR trap triggered"' ERR
(
ls /root/
)
我只收到一条 ERR 陷阱消息:
ls: cannot open directory '/root/': Permission denied
ERR trap triggered
我希望有人可以向我解释输出差异背后的原因。谢谢!
【问题讨论】:
-
这很奇怪。我总是希望收到两条消息,因为
ls提供的退出状态不同于零,因此也提供子shell 的退出状态。 -
我相信
bash在子shell中只有一个(非shell)命令时会优化子shell。 -
@chepner 我用谷歌搜索了你的怀疑,我认为你是对的。似乎在某些情况下 bash 会“优化”创建子外壳。我已使用此信息更新了我的问题。
-
你已经得到了自己的答案,你现在在问什么?
-
Stack Overflow 上的指导实际上是“如果答案相同,则问题可以视为重复”。这已经够晦涩难懂了,以至于我还在考虑是否要以骗子的身份关闭。您的回答推迟到指定的问题这一事实强烈暗示这应该实际上作为欺骗而被关闭。