我当使用Bourne Shell中遇到一个奇怪的命令:“>&”是什么意思,后跟一个文件名?
echo 123 >& result
通常我希望像echo 123 > result 2>&1
,我从来没有期望>&
之后将一个文件名。
但令我吃惊的是,当我在shell中执行此命令时,结果是正确的,它确实创建了一个名为“result”的文件,并且此文件包含文本“123”。
我很困惑这个语法。任何人都可以向我解释这个吗?
我当使用Bourne Shell中遇到一个奇怪的命令:“>&”是什么意思,后跟一个文件名?
echo 123 >& result
通常我希望像echo 123 > result 2>&1
,我从来没有期望>&
之后将一个文件名。
但令我吃惊的是,当我在shell中执行此命令时,结果是正确的,它确实创建了一个名为“result”的文件,并且此文件包含文本“123”。
我很困惑这个语法。任何人都可以向我解释这个吗?
这是一个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
STDOUT的文件描述符为1,默认情况下使用该描述符,如果您没有明确提及任何文件描述符。所以,如果我没有记错echo 123 >& result
是相同echo 123 1>&1 result
所以这里'&'实际上是多余的,因为它只是重定向标准输出到标准输出? – Sujoy
我测试过它,它似乎不是真的。 'echo 123>&x'输出'123'到一个名为'x'的文件 – Lekensteyn
你的猜测是错误的。这个语法是一个bashism,会影响stderr的输出。 – jlliagre
案件告破:
echo 123 >& result
相当于echo 123 > result 2>&1
请分享你是如何测试它的? –
@Aziz谢赫我偶然写了一个程序,它输出的东西到标准错误,你可以这样写: 的#include
不需要使用C,你可以用一个简单的shell命令来做同样的事情(请参阅我的回复)。 – jlliagre
是的,这是一个100%正确的答案,谢谢 – wangshuaijie
我也发现csh不支持2>&1,所以使用>&是将stderr重定向到csh中的标准输出的一种可行的方法。 – wangshuaijie