【问题标题】:reading errors returned from psql in a bash script在 bash 脚本中读取从 psql 返回的错误
【发布时间】:2019-11-19 23:26:25
【问题描述】:

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

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

psql_exit_status=$?

上述语句工作正常除非 sql 脚本中有错误,在这种情况下,我会在控制台上得到一些错误输出,但return_value 设置为零,psql_exit_status 也是如此。

build_table sql 脚本创建一个表并从 csv 文件导入数据——如果 csv 文件中存在错误,或者我故意在 sql 脚本中拼错 create tableeeee 我看到 psql 错误据我所知,屏幕没有返回任何错误信息。

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

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

【问题讨论】:

  • 我不知道psql,但它的手册页建议您可能需要启用ON_ERROR_STOP 才能在这种情况下退出并出现错误。

标签: bash postgresql psql


【解决方案1】:

来自psql documentation

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

所以您需要将-v ON_ERROR_STOP=on 添加到您的psql 选项中。

但是设置这个变量有以下副作用:

默认情况下,命令处理会在出错后继续。当此变量设置为 on 时,处理将立即停止。在交互模式下,psql 会返回到命令提示符;否则,psql 将退出,返回错误代码 3 以将此情况与致命错误情况区分开来,后者使用错误代码 1 报告。它可能已被调用)将立即终止。如果顶级命令字符串包含多个 SQL 命令,则处理将以当前命令停止。

【讨论】:

  • 对不起,我不得不修正你的答案。 ON_ERROR_STOP 不是环境变量。
  • 这真的很奇怪。你的建议听起来确实像要走的路,但是当我将它添加到我的 psql 选项中,并且 sql 脚本失败时,我的整个 bash 脚本也退出了——我在调用 psql 后直接输出了一些echo 命令与-v ON_ERROR_STOP=on,他们永远无法到达。结果我没有机会检查 psql 的返回值。
  • @steve 确定,我在另一篇关于退出问题的 SO 帖子中对此进行了描述:stackoverflow.com/questions/58965726/…
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2020-03-16
  • 2019-10-05
  • 2018-04-20
  • 2012-04-22
  • 2018-07-02
相关资源
最近更新 更多