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
相关产品推荐
相关产品推荐

