BASH 4如何捕获子命令错误信息并实现对应逻辑?
捕获子命令stderr并处理成功/失败场景
简单实现(满足大部分场景)
如果你的目标命令在执行成功时不会输出stderr内容,用下面的写法最直接:
subErr(){ echo "执行失败:$1" >&2 # 将错误信息输出到标准错误流,符合Unix规范 exit 1 } # 执行目标命令,捕获stdout到BLOB;若命令失败,捕获stderr到BLOB并触发错误处理 if ! BLOB=$(some long command 2>&1); then subErr "$BLOB" fi # 命令执行成功,用BLOB里的stdout内容继续后续操作 aws configure set x_security_token_expires "$(echo "$BLOB" | jq -r '.Credentials.Expiration')" --profile DEFAULT
写法说明:
2>&1:把目标命令的stderr重定向到stdout,这样$(...)可以捕获到错误输出! BLOB=$(...):判断命令执行是否失败(退出码非0),失败则进入if块- 命令成功时,
BLOB存储的是目标命令的stdout内容;失败时,BLOB存储的是目标命令的stderr内容,直接传给subErr函数打印并退出
严格区分stdout和stderr(兼容成功时也有stderr输出的场景)
如果目标命令在执行成功时也会输出stderr内容,需要严格分离stdout和stderr,可使用临时文件实现:
subErr(){ echo "执行失败:$1" >&2 exit 1 } # 创建临时文件存储命令输出 TMP_OUTPUT=$(mktemp) # 执行目标命令,将所有输出(stdout+stderr)写入临时文件 some long command > "$TMP_OUTPUT" 2>&1 EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then # 命令失败,读取临时文件里的错误信息并处理 ERR_CONTENT=$(cat "$TMP_OUTPUT") subErr "$ERR_CONTENT" else # 命令成功,读取临时文件里的stdout内容(此时stderr内容会被忽略,若需要可单独捕获) BLOB=$(cat "$TMP_OUTPUT") fi # 清理临时文件 rm "$TMP_OUTPUT" # 后续处理逻辑 aws configure set x_security_token_expires "$(echo "$BLOB" | jq -r '.Credentials.Expiration')" --profile DEFAULT
写法说明:
- 使用
mktemp创建临时文件存储命令的所有输出 - 通过
EXIT_CODE判断命令执行结果,失败时读取临时文件内容作为错误信息 - 成功时读取临时文件里的stdout内容(若需要单独保留stderr,可修改重定向规则,比如
some long command > "$TMP_STDOUT" 2>"$TMP_STDERR")
内容的提问来源于stack exchange,提问作者Simply Seth
相关产品推荐
相关产品推荐

