Bourne shell:强制STDOUT到STDERR

时间:2012-05-07 23:02:07

标签: shell sh

我正在创建一个Subversion post-commit hook。我需要强制将一个命令的输出强制转换为STDERR,这样后提交挂钩会将消息封送回客户端。

如何强制STDOUT到STDERR?

在此简化示例中,文件foo存在,但bar不存在。

# touch foo
# ls foo bar
ls: bar: No such file or directory
foo

我想将STDOUT发送给STDERR。我假设我可以使用>&2执行此操作,但它似乎无法正常工作。

我期待以下示例将STDOUT重定向到STDERR,并且/tmp/test将包含命令的输出和错误。但相反,似乎STDOUT从未重定向到STDERR,因此/tmp/test仅包含命令中的错误。

# ls foo bar >&2 2>/tmp/test
foo
# cat /tmp/test
ls: bar: No such file or directory

我错过了什么?

我在CentOS,Ubuntu,FreeBSD和MacOSX上尝试了上面的例子。

2 个答案:

答案 0 :(得分:9)

shell重定向一次一个地从左到右进行评估。所以当你有:

# ls foo bar >&2 2>/tmp/test

FIRST将stdout重定向到stderr(无论它最初是什么 - 可能是终端),然后将stderr重定向到/ tmp / test。所以stdout将指向最初指向的stderr而不是文件。你想要

# ls foo bar 2>/tmp/test >&2

将stderr重定向到FIRST文件,然后将stdout重定向到同一个地方。

答案 1 :(得分:-2)

STDOUT具有数字1文件描述符,您还需要指定它。所以你只是错过了一个。

$ ls bar 1>&2 2>test
$ cat test
ls: cannot access bar: No such file or directory

在bash的手册页中,在REDIRECTIONS下: -

Appending Standard Output and Standard Error
   This construct allows both the standard output (file descriptor 1) and the standard error output (file descriptor 2) to be appended to the
   file whose name is the expansion of word.

   The format for appending standard output and standard error is:

          &>>word

   This is semantically equivalent to

          >>word 2>&1