读取 bash 脚本中 psql 返回的错误

lar*_*ryq 4 postgresql bash psql

我需要在从 bash 脚本运行 psql 时检查错误。这是我们如何在脚本中运行的示例:

return_value=$(psql \
-X \
 $POSTGRES_CONNECTION_STRING \
-f ./build_table.sql \
-w \
-b \
-A \
-q \
-t \
)

psql_exit_status=$?
Run Code Online (Sandbox Code Playgroud)

除非 sql 脚本中有错误,否则上面的语句工作正常,在这种情况下,我在控制台上得到一些错误输出,但return_value被设置为零,就像 一样psql_exit_status

sqlbuild_table脚本创建一个表并从 csv 文件导入数据 - 如果 csv 文件中存在错误,或者如果我故意 create tableeeee在 sql 脚本中拼写错误,我会在屏幕上看到 psql 错误,但不会返回错误信息,如下所示我能说的最好的。

我尝试使用-opsql 中的标志输出到文件。什么也没有显示,这是一个空白文件。我还尝试2>&1在 psql 语句后添加一些内容,看看是否可以通过这种方式获得一些错误信息,但没有任何作用。

我需要的是某种方法来告诉 sql 脚本已异常退出和/或崩溃,而不必查看屏幕上的输出。我执行 psql 的方式可能吗?我的 psql 标志之一可能有问题吗?

ste*_*eve 6

psql文档中:

如果 psql 正常完成,则向 shell 返回 0;如果发生自身的致命错误(例如,内存不足、未找到文件),则返回 1;如果与服务器的连接出现故障且会话无法交互,则返回 2;如果发生错误,则返回 3。脚本中发生错误并且ON_ERROR_STOP设置了变量。

所以你需要添加-v ON_ERROR_STOP=on你的psql选择。

然而,设置此变量会产生以下副作用:

默认情况下,命令处理在发生错误后继续。当此变量设置为打开时,处理将立即停止。在交互模式下,psql会返回到命令提示符;否则,psql 将退出,返回错误代码 3,以区分这种情况与使用错误代码 1 报告的致命错误情况。在任何一种情况下,任何当前正在运行的脚本(顶级脚本,如果有,以及任何其他脚本)它可能已被调用)将立即终止。如果顶级命令字符串包含多个 SQL 命令,则处理将以当前命令停止。