Bash脚本中如何捕获AWS CLI命令的执行错误?
Bash实现SecretsManager错误捕获的修正方案
你的脚本问题在于仅捕获了jq命令的错误输出,而AWS CLI的错误信息直接打印到终端,导致还没进入判断流程就看到报错。以下是两种可靠的修正方案:
方案一:捕获所有输出并匹配错误信息
通过子shell包裹整个命令链,将所有stdout和stderr统一捕获到变量中,再判断是否包含目标错误:
# 捕获命令链的全部输出(包括AWS和jq的错误) command=$((aws secretsmanager get-secret-value --secret-id "${secret_name}" --query SecretString --output text | jq .) 2>&1) if [[ "${command}" =~ "An error occurred (ResourceNotFoundException)" ]]; then echo "Configuration does not exist in SecretsManager. Unable to initialize Metaflow settings" else echo "Configuration exists in SecretsManager. Initializing Metaflow settings" echo "${command}" > ~/.metaflowconfig/config.json fi
方案二:基于命令退出码判断(更可靠)
利用AWS CLI的退出状态码判断执行结果,避免依赖错误文本的匹配,稳定性更高:
# 执行AWS命令,将stderr丢弃(不直接输出错误),保存stdout到变量 secret_output=$(aws secretsmanager get-secret-value --secret-id "${secret_name}" --query SecretString --output text 2>/dev/null) # 获取命令退出码(0为成功,非0为失败) aws_exit_code=$? if [[ ${aws_exit_code} -ne 0 ]]; then echo "Configuration does not exist in SecretsManager. Unable to initialize Metaflow settings" else # 格式化JSON并写入配置文件 formatted_secret=$(echo "${secret_output}" | jq .) echo "Configuration exists in SecretsManager. Initializing Metaflow settings" echo "${formatted_secret}" > ~/.metaflowconfig/config.json fi
关键修正点
- 给变量
${secret_name}添加双引号,避免参数含空格时出错 - 方案一中用子shell
(...)包裹命令链,再统一重定向2>&1,确保所有错误都被捕获到变量 - 方案二中通过
$?获取命令退出码,比匹配错误文本更可靠(错误信息可能随AWS CLI版本变化)
内容的提问来源于stack exchange,提问作者Riley Hun
相关产品推荐
相关产品推荐

