在远程服务器上 运行 时无法获取 psql 错误

Unable to get psql error when running on remote server

我在远程服务器上为 运行 psql 脚本写了一个 bash 脚本。基本上我使用的命令是:

psql --out test.log -h HOST_IP_ADDRESS -U USER_NAME -d DATABASE -f SQL_FILE

命令 运行 没问题,但是当我模拟错误以测试它时,即使我在 shell 中看到错误,我也无法获取错误消息,如您所见以下

psql:SQL_FILE.sql:71: ERROR:  relation "TABLE_NAME" does not exist

我已经试过了:

  1. 使用 -o output_file 但它生成一个空文件
  2. 使用 var=$(psql command) 但变量 returns 为空
  3. psql command > file.log 但错误不在生成的文件中。

知道我该如何解决这个问题吗?

谢谢

尝试

psql command 2> errors.log

2表示"redirect file descriptor 2",也就是标准误。这会将错误保存到名为 errors.log.

的文件中

要将错误转化为变量:

var=$(psql command 2>&1)
echo "$var"

这里我们将标准错误 (2) 重定向到文件描述符 1(标准输出)。

您可能尝试在此处使用旧的已过时的反引号 ` 字符,但 ` 是此站点上的格式字符 $(...) 是首选。

失败的命令通常会生成 return 代码。您可以在执行命令后立即使用 $? 特殊变量获取此 return 代码。例如,你可以这样做:

psql ARGUMENT LIST
result=$?

if
  [ $result = 0 ]
then
  echo "Success"
else
  echo "Failure with error code $result"
fi

return 代码通常应该是命令成功或失败的最可靠指示。

命令还可以在两个标准输出通道之一上发送消息:标准输出 (stdout) 和标准错误 (stderr)。两者通常都出现在您的终端上,但它们实际上是分开的,如果您愿意,可以单独处理。

您可以使用命令替换收集 stderr、stdout 或两者:

stdout_messages="$(command and args 2>/dev/null)"
stderr_messages="$(command and args 2>&1 1>/dev/null)"
all_messages="$(command and args 2>&1)"

这些命令有类似 X>/dev/null 的重定向,以避免显示未收集的消息,但您可以删除它们以在终端上看到它们。

stderr 上存在任何消息并不表示命令失败,因为许多程序可能使用 stderr 来处理非致命的状态消息或错误。命令替换应该用于收集消息,而不是确定命令是否失败,除非您有非常特殊的需要。

您可以结合这两种机制,通过收集消息,然后使用 $? 确定状态。

我不知道 psql,但如果您的问题与正在远程执行的操作有关,您可以做的一件事是使用 ssh 连接到远程主机并在那里执行命令,就好像它是本地的。 ssh 然后将转发 return 代码。

看起来像这样:

ssh user@remote_host psql ARGUMENT LIST

您将从命令中删除任何与远程执行有关的内容,因为它会在本地执行。