【问题标题】:Single statement subshell doesn't seem to inherit ERR trap when using "set -o errtrace" [duplicate]使用“set -o errtrace”时,单语句子shell似乎没有继承ERR陷阱[重复]
【发布时间】: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

但是,当我让 subshel​​l 包含单个语句时,例如:

#!/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 上的指导实际上是“如果答案相同,则问题可以视为重复”。这已经够晦涩难懂了,以至于我还在考虑是否要以骗子的身份关闭。您的回答推迟到指定的问题这一事实强烈暗示这应该实际上作为欺骗而被关闭。

标签: bash subshell bash-trap


【解决方案1】:

我正在回答我自己的结束问题。

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

Here is a StackExchange question 的回答提供了有关此 Bash 行为的更多详细信息。

至于文档,我将重复 Stackexchange 答案中的内容。我能找到的关于这种行为的唯一文档是在 Bash source file here

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2021-02-27
    • 2015-02-17
    • 1970-01-01
    • 2020-06-23
    相关资源
    最近更新 更多