在远程服务器上 运行 时无法获取 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
我已经试过了:
- 使用
-o output_file
但它生成一个空文件
- 使用
var=$(psql command)
但变量 returns 为空
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
您将从命令中删除任何与远程执行有关的内容,因为它会在本地执行。
我在远程服务器上为 运行 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
我已经试过了:
- 使用
-o output_file
但它生成一个空文件 - 使用
var=$(psql command)
但变量 returns 为空 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
您将从命令中删除任何与远程执行有关的内容,因为它会在本地执行。