遍历返回错误的命令输出时,如何让循环返回非零退出状态码?
解决方法
原脚本中$(false)的退出状态不会传递给for循环的退出状态——因为循环本身没有执行任何迭代,最终$?取的是循环正常结束的状态码0。要让最终的退出状态反映命令的错误,有以下几种可行方案:
方案1:提前捕获命令的退出状态
先执行目标命令并保存输出和退出码,再遍历输出,最后返回原命令的退出码:
# 执行命令,保存输出和退出状态 cmd_output=$(false) cmd_exit=$? # 遍历输出(false无输出,此循环不会执行) for i in $cmd_output do echo "$i" done # 返回原命令的退出码 exit $cmd_exit
执行后echo $?会得到1(false的退出码)。
方案2:使用管道+pipefail选项
如果适合用while read处理输出(可避免命令替换的分词问题),可以开启pipefail让管道的退出状态反映第一个失败命令的状态:
# 开启pipefail,管道的退出状态为最后一个非零命令的状态 set -o pipefail # 通过管道传递输出,同时保留原命令的退出状态 false | while read -r i do echo "$i" done # 此时$?会是false的退出码1 echo $?
方案3:提前捕获命令状态并在循环后判断
如果需要保留循环逻辑,可提前捕获命令的退出状态,循环结束后判断并返回:
# 先执行命令并捕获退出状态 cmd_output=$(false) cmd_exit=$? # 执行循环 for i in $cmd_output do echo "$i" done # 若原命令失败,返回其退出码 [ $cmd_exit -ne 0 ] && exit $cmd_exit
内容的提问来源于stack exchange,提问作者zedoo
相关产品推荐
相关产品推荐

