RHEL 7 Bash脚本Ingres SQL命令错误捕获问题求助
Ingres SQL命令错误捕获的最小改动方案
问题背景
在RHEL 7的Bash脚本中调用Ingres的sql命令执行SELECT查询时,成功场景下会通过管道将结果转为CSV格式保存;但当SQL存在拼写错误等问题时,错误信息会被管道过滤,导致输出文件为空,必须手动移除管道重新执行才能查看错误详情。此前尝试用tee结合进程替换检测以E_开头的错误行,将完整输出写入$ERRLOG并退出脚本,但方案未生效——ERRLOG为空且exit 1未触发。
解决方案
核心问题在于Ingres的sql命令通常将错误信息输出到标准错误(stderr),而非标准输出(stdout),此前的方案未捕获stderr,导致错误信息没进入ERRLOG。以下是最小改动的实现方式:
脚本修改步骤
- 在
sql命令后添加2>&1,将stderr合并到stdout,确保错误信息能被后续命令捕获; - 在管道中插入
tee "$ERRLOG",将所有输出(正常结果+错误信息)写入日志文件; - 执行完管道后,用
grep检查ERRLOG中是否存在Ingres的错误行(以E_开头),存在则触发退出逻辑。
完整示例片段
#!/bin/bash OUTPUT_FILE="query_result.csv" ERRLOG="sql_exec.log" DB_NAME="your_database" SQL_QUERY="SELECT column1, column2 FROM target_table;" # 执行SQL,合并stderr到stdout,同时写入ERRLOG,再转存为CSV sql "$DB_NAME" -c "$SQL_QUERY" 2>&1 | tee "$ERRLOG" | csv_converter > "$OUTPUT_FILE" # 检查是否存在Ingres错误 if grep -q "^E_" "$ERRLOG"; then echo "SQL执行失败,错误详情请查看$ERRLOG" # 清理空的输出文件 rm -f "$OUTPUT_FILE" exit 1 fi echo "查询完成,结果已保存至$OUTPUT_FILE"
说明
- 仅需在原管道命令中增加
2>&1和tee "$ERRLOG",改动极小; - 确保了正常查询时结果能正确转存为CSV,出错时错误信息完整保留在
ERRLOG中,且脚本自动退出并提示; - 可选添加
rm -f "$OUTPUT_FILE"避免空文件残留。
内容的提问来源于stack exchange,提问作者exharris
相关产品推荐
相关产品推荐

