Bourne shell:强制STDOUT到STDERR

Ste*_*ski 3 shell sh

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

如何强制STDOUT到STDERR?

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

# touch foo
# ls foo bar
ls: bar: No such file or directory
foo
Run Code Online (Sandbox Code Playgroud)

我想将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
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

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

Chr*_*odd 9

shell重定向按一对一,从左到右进行评估.所以当你有:

# ls foo bar >&2 2>/tmp/test
Run Code Online (Sandbox Code Playgroud)

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

# ls foo bar 2>/tmp/test >&2
Run Code Online (Sandbox Code Playgroud)

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