为何set -e配置下false && true不会触发Bash脚本错误退出?
核心原因
set -e是Bash的errexit模式,它的生效规则是:脚本中某条命令返回非0退出状态时,默认立刻终止脚本执行,但这个规则存在明确的豁免场景,两个脚本的行为差异正是命中了其中一条豁免规则:
若失败的命令是
&&或||连接的命令列表的组成部分,该命令的非0退出状态不会触发脚本终止。
行为差异说明
未终止的脚本
对应代码:
set -e false && true echo $? echo Done
执行流程:
- 开启errexit模式后执行
false && true:&&为短路逻辑符,前序命令false返回非0状态时,后续true不会执行,整个语句的最终退出码为1,也就是false的返回值。 - 由于
false属于&&连接的命令链的一部分,符合上述豁免条件,set -e不会触发脚本终止。 - 后续语句顺序执行:先打印上一条语句的退出码
1,再打印Done,和实际运行输出一致。
直接终止的脚本
对应代码:
set -e false echo $? echo Done
执行流程:
- 开启errexit模式后,
false作为独立语句执行,不属于&&/||命令链、不在条件判断结构中、返回值也没有被逻辑取反,不满足任何豁免条件。 false返回非0状态时直接触发set -e的终止规则,脚本立刻退出,后续两条echo命令没有执行机会,因此运行后无任何输出。
其他常见set -e豁免场景
除了&&/||连接的命令链,以下场景中命令返回非0也不会触发脚本终止:
- 命令位于
if/elif/while/until的条件判断块中 - 命令是管道中除最后一条命令外的其他命令(未开启
set -o pipefail配置时) - 命令的返回值被
!做逻辑取反 - 命令位于算术求值、数组赋值等特殊表达式上下文中的部分场景
内容的提问来源于stack exchange,提问作者Dmitriy Kumshayev
相关产品推荐
相关产品推荐

