You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何set -e配置下false && true不会触发Bash脚本错误退出?

核心原因

set -e是Bash的errexit模式,它的生效规则是:脚本中某条命令返回非0退出状态时,默认立刻终止脚本执行,但这个规则存在明确的豁免场景,两个脚本的行为差异正是命中了其中一条豁免规则:

若失败的命令是&&或||连接的命令列表的组成部分,该命令的非0退出状态不会触发脚本终止。

行为差异说明

未终止的脚本

对应代码:

set -e
false && true
echo $?
echo Done

执行流程:

  1. 开启errexit模式后执行false && true:&&为短路逻辑符,前序命令false返回非0状态时,后续true不会执行,整个语句的最终退出码为1,也就是false的返回值。
  2. 由于false属于&&连接的命令链的一部分,符合上述豁免条件,set -e不会触发脚本终止。
  3. 后续语句顺序执行:先打印上一条语句的退出码1,再打印Done,和实际运行输出一致。

直接终止的脚本

对应代码:

set -e
false
echo $?
echo Done

执行流程:

  1. 开启errexit模式后,false作为独立语句执行,不属于&&/||命令链、不在条件判断结构中、返回值也没有被逻辑取反,不满足任何豁免条件。
  2. false返回非0状态时直接触发set -e的终止规则,脚本立刻退出,后续两条echo命令没有执行机会,因此运行后无任何输出。

其他常见set -e豁免场景

除了&&/||连接的命令链,以下场景中命令返回非0也不会触发脚本终止:

  • 命令位于if/elif/while/until的条件判断块中
  • 命令是管道中除最后一条命令外的其他命令(未开启set -o pipefail配置时)
  • 命令的返回值被!做逻辑取反
  • 命令位于算术求值、数组赋值等特殊表达式上下文中的部分场景

内容的提问来源于stack exchange,提问作者Dmitriy Kumshayev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 23:06:08