2011-10-08 60 views
3

我当使用Bourne Shell中遇到一个奇怪的命令:“>&”是什么意思,后跟一个文件名?

echo 123 >& result

通常我希望像echo 123 > result 2>&1,我从来没有期望>&之后将一个文件名。

但令我吃惊的是,当我在shell中执行此命令时,结果是正确的,它确实创建了一个名为“result”的文件,并且此文件包含文本“123”。

我很困惑这个语法。任何人都可以向我解释这个吗?

回答

2

这是一个bash的扩展意味着重定向标准输出和标准错误的结果文件。

可移植的方式来达到同样与POSIX兼容的炮弹是:

echo 123 >bar 2>&1 

为“echo 123”是不太可能在stderr输出任何东西,这句法是没用在这里。

下面是一个例子展示它的工作:

(echo stderr 1>&2;echo stdout) >& foo 

(echo stderr 1>&2;echo stdout) >bar 2>&1 
+0

是的,这是一个100%正确的答案,谢谢 – wangshuaijie

+0

我也发现csh不支持2>&1,所以使用>&是将stderr重定向到csh中的标准输出的一种可行的方法。 – wangshuaijie

1

STDOUT的文件描述符为1,默认情况下使用该描述符,如果您没有明确提及任何文件描述符。所以,如果我没有记错echo 123 >& result是相同echo 123 1>&1 result

+0

所以这里'&'实际上是多余的,因为它只是重定向标准输出到标准输出? – Sujoy

+0

我测试过它,它似乎不是真的。 'echo 123>&x'输出'123'到一个名为'x'的文件 – Lekensteyn

+0

你的猜测是错误的。这个语法是一个bashism,会影响stderr的输出。 – jlliagre

1

案件告破:

echo 123 >& result相当于echo 123 > result 2>&1

+0

请分享你是如何测试它的? –

+0

@Aziz谢赫我偶然写了一个程序,它输出的东西到标准错误,你可以这样写: 的#include INT主(INT ARGC,字符** argv的) { fprintf中(标准输出,“这会标准输出\ n“); fprintf(stderr,“这会去stderr \ n”); return 0; }并编译它以获得a.out,当您调用./a.out>结果时,当您调用./a时,将看到“stdout”行将出现在结果文件中,并且“stderr”行出现在屏幕上.out>&result,你会发现结果中会出现“stdout”和“stderr”这两行。 – wangshuaijie

+0

不需要使用C,你可以用一个简单的shell命令来做同样的事情(请参阅我的回复)。 – jlliagre