我想知道set -e是否通过子 shell 传播(即子 shell 是否继承了其父对象的-e设置),所以我做了一些实验。我发现了一些无法解释的奇怪结果。

首先,这是一些基本测试。他们返回了我的期望。

( true; false )         # 1
( false; true )         # 0
( set -e; false; true ) # 1

现在,我尝试了如果将子shell放入子shell中会发生什么情况。该表达式返回1,表明它正在传播。
( set -e; ( false; true ) )

然后,我尝试了这些表达式。我希望它们返回1,但是我发现它们返回0。
( set -e; ( true; false ); true )
( set -e; ( set -e; false; true ); true )

为什么?在这两种情况下,无论set -e是否传播(如我在开头所检查的那样),内部子Shell均返回1。外部子 shell 具有set -e,这意味着它在内部子 shell 退出后应该会失败,但不会失败。有人可以解释吗?

最佳答案

bash 4之前,set -e似乎仅在简单命令具有非零退出(强调我的退出)的情况​​下导致 shell 退出:



bash 4(可能是4.1,我没有要检查的4.0)中,-e的作用扩展到了更复杂的命令:

关于bash - “set -e”如何与子 shell 一起使用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22630363/

10-16 06:57