Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取bash脚本中从psql返回的错误_Bash_Postgresql_Psql - Fatal编程技术网

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

读取bash脚本中从psql返回的错误,bash,postgresql,psql,Bash,Postgresql,Psql,我需要在从bash脚本运行psql时检查错误。下面是我们如何在脚本中运行的示例: return_value=$(psql \ -X \ $POSTGRES_CONNECTION_STRING \ -f ./build_table.sql \ -w \ -b \ -A \ -q \ -t \ ) psql_exit_status=$? 除非sql脚本中有错误,否则上述语句可以正常工作,在这种情况下,我在控制台上得到一些错误输出,但是return\u value设置为零,就像psql\u ex

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

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

psql_exit_status=$?
除非sql脚本中有错误,否则上述语句可以正常工作,在这种情况下,我在控制台上得到一些错误输出,但是
return\u value
设置为零,就像
psql\u exit\u status
一样

build_table
sql脚本创建一个表并从csv文件导入数据——如果csv文件中有错误,或者如果(比如)我在sql脚本中故意拼错了
create tableeee
,我会在屏幕上看到psql错误,但不会返回错误信息

我已经尝试在psql中使用
-o
标志来输出到文件。没有显示,这是一个空白文件。我还尝试在psql语句后添加一个
2>&1
位,看看是否可以通过这种方式获得一些错误信息,但没有任何效果

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

来自:

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

因此,您需要将
-v ON\u ERROR\u STOP=ON
添加到
psql
选项中

但是,设置此变量会产生以下副作用:

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


我不知道
psql
,但是它的手册页建议您可能需要启用
ON\u ERROR\u STOP
,以便在这种情况下它带着错误退出。对不起,我必须修复您的答案
ON\u ERROR\u STOP
不是环境变量。这真的很奇怪。你的建议听起来确实是个不错的选择,但是当我将它添加到我的psql选项中,sql脚本失败时,我的整个bash脚本也在那一点上退出了——我在用
-v ON\u ERROR\u STOP=ON
调用psql后直接输出了一些
echo
命令,而它们永远无法到达。因此,我没有机会检查psql的返回值。@steve sure thing,我在另一篇关于退出问题的SO帖子中对此进行了描述: