如何让AWS CLI仅在特定无更新错误场景返回退出码0?求方案
解决AWS CloudFormation UpdateStack特定错误场景下的退出码问题
我之前处理CloudFormation自动化部署时也碰到过一模一样的问题!单纯用grep管道确实没法满足需求,因为它只会返回自身的匹配状态,没法保留原AWS CLI命令的退出码逻辑。下面给你两个实用的解决方案:
方案一:捕获输出+条件判断(推荐,可读性强)
这个方法会完整保留原命令的输出,同时精准控制退出码:
# 执行你的AWS UpdateStack命令,捕获所有输出(包括错误信息) stack_output=$(aws cloudformation update-stack --stack-name YOUR_STACK_NAME --template-body file://your-template.yml ... 2>&1) # 记录原命令的退出码 original_exit=$? # 判断:原命令失败,且输出包含目标错误信息 if [[ $original_exit -ne 0 && "$stack_output" == *"No updates are to be performed."* ]]; then # 符合特定场景,返回退出码0 echo "$stack_output" # 可选:把输出打印到控制台,方便查看 exit 0 else # 其他情况,返回原命令的退出码 echo "$stack_output" exit $original_exit fi
方案二:简洁的管道组合(适合嵌入脚本)
如果想写得更紧凑,可以用临时文件或者here-string来实现:
# 执行命令并把输出同时打印到控制台和临时文件 aws cloudformation update-stack --stack-name YOUR_STACK_NAME ... 2>&1 | tee /tmp/aws_stack_output original_exit=$? # 检查临时文件中是否存在目标错误 if grep -q "No updates are to be performed." /tmp/aws_stack_output; then exit 0 else exit $original_exit fi
为什么你的原命令没生效?
你之前用的command 2>&1 | grep "No updates are to be performed."有两个核心问题:
- 管道的退出码是最后一个命令(也就是grep)的状态,不是原AWS命令的。比如原命令成功但没匹配到字符串,grep会返回1,导致整个命令退出码为1,这不符合预期。
- 没法区分“原命令失败但属于特定错误”和“原命令失败是其他错误”的情况,会把所有匹配到字符串的场景都返回0,不管原命令实际状态。
内容的提问来源于stack exchange,提问作者Mazzy
相关产品推荐
相关产品推荐

