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

shopt -s inherit_errexit在declare中不生效,如何让子命令失败时脚本退出

问题原因

set -e(即errexit选项)仅会在简单命令返回非零退出码时触发脚本退出。你将declare和命令替换写在同一行时,整个语句的退出码默认是declare命令本身的退出码,只要declare语法没有错误,它的返回值永远是0,因此即使命令替换中的子命令执行失败,也不会触发set -e退出。
你已经开启的inherit_errexit仅能保证命令替换的子shell继承errexit选项,无法改变declare语句返回0的行为。

解决方案

方案1:拆分变量声明与赋值(兼容所有Bash版本)

把变量声明和赋值拆分为两行,赋值语句的退出码直接等于命令替换的退出码,失败就会触发脚本退出:

#!/bin/bash
set -e
set -o pipefail
shopt -s inherit_errexit

declare _x
_x=`command-with-error` # 赋值语句返回值等于子命令退出码,失败直接退出
echo "_x=${_x}"

方案2:开启assign_errexit选项(仅Bash 5.1及以上版本支持)

Bash 5.1版本引入了assign_errexit选项,开启后,带有declare/local/readonly等声明关键字的赋值语句,退出码等于命令替换的退出码,符合你的预期:

#!/bin/bash
set -e
set -o pipefail
shopt -s inherit_errexit
shopt -s assign_errexit # 新增这行

declare _x=`command-with-error` # 子命令失败时整个语句返回非零,触发脚本退出
echo "_x=${_x}"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:30:03