如何解析Bash脚本错误信息?脚本错误捕获失效问题排查
解决jq错误信息未被捕获导致脚本判断失效的问题
这个问题我碰到过!核心原因是你没搞清楚命令的**标准输出(stdout)和标准错误(stderr)**的区别,让我给你拆解一下:
为什么原脚本会输出success?
jq在解析失败时,会把错误信息输出到标准错误流,而$()默认只会捕获命令的标准输出流内容。所以你的COMMAND变量实际上是空字符串,自然匹配不到*"error"*,脚本就会走到else分支输出success。
两种正确的解决方法
方法1:将stderr重定向到stdout,捕获错误信息
如果需要保留错误信息用于后续判断,可以把标准错误流重定向到标准输出流,这样$()就能捕获到错误内容:
#!/bin/bash COMMAND=$(echo test | jq 2>&1) if [[ $COMMAND == *"error"* ]]; then echo failed else echo success fi
这里的2>&1就是把文件描述符2(stderr)的内容重定向到文件描述符1(stdout),这样错误信息就会被存入COMMAND变量,判断条件就能正常生效。
方法2:直接检查命令的退出状态码
如果不需要错误内容,只需要判断命令是否执行成功,更简洁的方式是直接检查jq的退出状态码(成功时为0,失败时非0):
#!/bin/bash if echo test | jq >/dev/null 2>&1; then echo success else echo failed fi
这里的>/dev/null 2>&1是把stdout和stderr都丢弃,只关注命令的执行结果状态,逻辑更清晰。
内容的提问来源于stack exchange,提问作者script_jr
相关产品推荐
相关产品推荐

