>&是什么意思?


80

这个表达让我有些困惑:

gcc -c -g program.c >& compiler.txt

我知道&>filename会将stdout和stderr都重定向到file filename。但是在这种情况下,“&”号在大于号之后。它看起来像形式M>&N,其中MN是文件描述符。

在上面的代码段中,是M=1N='compiler.txt'吗?与以下内容有何不同?

gcc -c -g program.c > compiler.txt     (ampersand removed)

我的理解是,每个打开的文件都与一个大于2的文件描述符相关联。这正确吗?

如果是这样,文件名是否可以与其作为重定向目标的文件描述符互换?

Answers:


92

这与相同&>。从bash手册页:

重定向标准输出和标准错误此结构允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)都重定向到名称为word扩展的文件。

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1

6
我真傻。我花了很多时间阅读其他资源,它就在手册页中。
矛盾的2012年

3
>&是csh和tcsh用来重定向stdout和stderr的语法。这可能就是bash接受它的原因。
基思·汤普森

4
这是否意味着&>word>word 2>&1在语义上是等效的?我不清楚“此”的前提。
2015年

8
@geneorama &>word>word 2>&1并且 >&word是完全一样的。
约旦2015年

1
现在我意识到,根据我在其他地方阅读的内容,我之前犯了一个错误。>仅将标准重定向。 >不重定向错误。(我可能应该将我以后的评论重定向到/dev/null
2015年

7

&>vs >&:首选版本是&>(clobber)

关于:

  • &>
  • >&

两者都会破坏文件-像> file在仅STDIN的情况下一样,在写入文件之前将文件截断为0个字节。

但是bash手动重定向部分添加了以下内容:

在两种形式中,第一种是优选的。这在语义上等同于

>word 2>&1

使用第二种形式时,单词可能不会扩展为数字或-。如果是这样,出于兼容性原因,将应用其他重定向操作符(请参阅下面的“复制文件描述符”)。

(注:zsh这两个是等价的。)

最好以(&>)形式获得手指记忆,因为:

(附加)不支持使用&>>as>>&bash

只有一种附加形式:

附加标准输出和标准错误的格式为:

&>>word

这在语义上等同于

>>word 2>&1

(请参见下面的复制文件描述符)。

注意:

  • 再次建议使用&>以上>&部分中的over来代替,因为只有一种添加方式bash
  • zsh允许&>>>>&形式。

这个答案比被推荐的答案更有帮助。
slayer

那么&,shell解释器会将特殊字符转换为1和2吗?
赫·莫卡登

@FakherMokadem不,请参见手册
汤姆·黑尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.