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


5

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

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql 

它会产生大量的错误输出,其中我只能看到我的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

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

$ psql -d template_postgis -f /usr/local/pgsql-9.1/share/contrib/postgis-2.0/postgis.sql > error.txt

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

SET
BEGIN
ROLLBACK

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

Answers:


14

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

> 您只将STDOUT重定向到文件。

2> 您将STDERR重定向到一个文件(“2”,因为它的文件描述符是“2”)。


实际上,也有STDIN,你可以重定向 <。这个 图像 显示他们通常如何互动。

diagram

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

command > normal.log 2> err.log

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

command 2>&1 > out.log

作为简写,您还可以立即将所有内容重定向到一个文件中 - 至少使用 炮弹。尽管如此,不要依赖于此。

command &> out.log

1
+1,但使用'&amp;&gt;'重定向两个流可以说是无效的shell语法。 dash 一个人会解析 & 作为终结者这样做 ls &> foo 成为2个命令:ls在后台运行,foo被截断。使用该构造是不安全的。就个人而言,我认为破折号语义是正确的,但是足够的shell与这种情况下的语言规范冲突,“模糊”是描述解析而不引发邪恶的火焰战争的唯一合理的形容词。避免'&amp;&gt;'
William Pursell

1
是的,我说,“大多数贝壳”,但我知道你的意思。关于shell脚本和可移植性,无论如何都有很多陷阱,所以我猜你不应该使用它。
slhck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.