将所有错误消息发送到文本文件?

Ric*_*ard 6 bash shell command-line

我正在尝试运行以下命令:

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql 
Run Code Online (Sandbox Code Playgroud)

它产生了大量的错误输出,其中我只能在我的 shell 中看到结尾——我需要看到开头才能弄清楚出了什么问题。

... 
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6065: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6075: ERROR:  current transaction is aborted, commands ignored until end of transaction block
psql:/usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql:6081: ERROR:  current transaction is aborted, commands ignored until end of transaction block
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试将消息发送到文本文件:

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql > error.txt
Run Code Online (Sandbox Code Playgroud)

文本文件只包含三个命令:

SET
BEGIN
ROLLBACK
Run Code Online (Sandbox Code Playgroud)

那么为什么不是所有的输出都被发送到文本文件,我怎样才能看到所有的输出呢?

slh*_*hck 15

在 Unix(和其他)中,您通常要使用两个输出流,STDOUT 和 STDERR。两者都是标准流

有了>你只stdout重定向到一个文件中。

随着2>您重定向错误输出到一个文件中(“2”,因为它的文件描述符为“2”)。


实际上,还有 STDIN,您可以使用<. 此显示了它们通常如何交互。

图表

由于错误消息应始终打印到 STDERR(并且大多数程序都遵守这一点),因此请尝试将正常输出和错误输出分开:

command > normal.log 2> err.log
Run Code Online (Sandbox Code Playgroud)

同样,您可以将 STDERR 重定向到 STDOUT。

command 2>&1 > out.log
Run Code Online (Sandbox Code Playgroud)

简而言之,您还可以立即将所有内容重定向到一个文件中——至少对于大多数shell。但是不要依赖它来实现便携性。

command &> out.log
Run Code Online (Sandbox Code Playgroud)