我写了一个bash脚本来在远程服务器上运行psql scrips。基本上我使用的命令是:
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)
但var返回空psql command > file.log
但错误不在生成的文件中。知道如何解决这个问题?
由于
答案 0 :(得分:1)
失败的命令通常会生成返回码。您可以在执行命令后立即使用$?
特殊变量获取此返回码。例如,您可以这样做:
psql ARGUMENT LIST
result=$?
if
[ $result = 0 ]
then
echo "Success"
else
echo "Failure with error code $result"
fi
返回代码通常应该是命令成功或失败的最可靠指示。
命令也可以在两个标准输出通道中的任何一个上发送消息:标准输出(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来处理状态消息或非致命错误。除非您有特殊需要,否则应使用命令替换来收集消息,而不是确定命令是否失败。
您可以通过收集邮件,然后使用$?
确定状态来组合这两种机制。
答案 1 :(得分:0)
尝试
psql command 2> errors.log
2表示“重定向文件描述符2”,这是标准错误。这会将错误保存到名为errors.log
的文件中。
将错误输入变量:
var=$(psql command 2>&1)
echo "$var"
这里我们将标准错误(2)重定向到文件描述符1(标准输出)。
您可能尝试在此处使用旧的过时反引号字符,但`是此网站上的格式字符$(...)
是首选。
答案 2 :(得分:0)
我不知道psql,但如果您的问题与远程执行的操作有关,您可以做的一件事是使用ssh
连接到远程主机并在那里执行命令,就像它是本地。然后ssh
将转发返回码。
看起来像这样:
ssh user@remote_host psql ARGUMENT LIST
您将从命令中删除与远程执行有关的任何内容,因为它将在本地执行。