3

我正在创建一个 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 上尝试过上面的例子。

4

2 回答 2

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 重定向到文件,然后将 stdout 重定向到同一位置。

于 2012-05-08T00:09:26.720 回答
-2

STDOUT 具有编号为 1 的文件描述符,您还需要指定它。所以你只是错过了一个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
于 2012-05-07T23:21:40.853 回答