POSIX shell 标准对的应用给出了三个例外set -e
:
- 多命令管道中任何单个命令的失败都不应导致 shell 退出。仅应考虑管道本身的失败。
- 执行 while、until、if 或 elif 保留字之后的复合列表、以 ! 保留字开头的管道或除最后一个之外的任何 AND-OR 列表的命令时,应忽略 -e 设置。
- 如果除子 shell 命令之外的复合命令的退出状态是由于 -e 被忽略时发生故障而导致的,则 -e 不适用于此命令。
我很难理解 (3) 的含义;它指的是:
set -e
{ false; } && :
( false ) && :
这里,{ false; }
是一个非子 shell 复合命令,其退出状态为 1。由于 false 的“失败”导致退出状态。set -e
执行时被忽略,false
因为它不是 AND-OR 列表中的最后一个命令。 同样适用于( false )
,但它是一个子 shell 命令,因此允许set -e
在父 shell 中应用于它并因此退出?
在实际的 shell 中似乎并非如此,所以我很确定这个例子不是 (3) 所说的。毕竟,这意味着if ( false ); then :; fi
在执行 if 条件时可能会退出。但是,似乎唯一set -e
被忽略的上下文是由 (2) 定义的,那么什么时候 (3) 才能以合乎逻辑的方式应用呢?
本质上,什么例子可以清楚地说明 (3) 的含义,包括它的适用范围以及为什么它对子壳层进行区分?
我认为“除了子 shell 命令之外”意味着整个复合命令必须是子 shell 命令。
比较一下:
的退出状态
false && :
是:false
失败的结果-e
被忽略(因为它不是 AND-OR 管道中的最后一条命令)但:
因此前者会触发
set -e
,而后者则不会。和: