什么>&意思?

时间:2012-06-29 02:48:04

标签: bash io file-descriptor io-redirection

我对这个表达有点困惑:

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

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

在上面的代码段中,是M=1还是N='compiler.txt'?这究竟与以下有何不同:

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

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

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

2 个答案:

答案 0 :(得分:76)

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

  

重定向标准输出和标准错误       此构造允许标准输出(文件描述符1)和       要重定向到的标准错误输出(文件描述符2)       文件,其名称是单词的扩展。

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

答案 1 :(得分:2)

&>>&:首选版本是&>(Clobber)

关于:

  • &>
  • >&

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

但是bash manual Redirections section添加:

  

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

>word 2>&1
     

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

(请注意:in zsh both are equivalent。)

以第一种(&>)形式获得手指记忆是一种很好的做法,因为:

使用&>>,因为>>&不支持bash(附加)

只有一种附加形式:

  

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

&>>word
     

这在语义上等同于

>>word 2>&1
     

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

注意:

  • 鉴于在&>中只有一种添加方式,因此再次建议在以上部分中使用>&取代bash
  • zsh允许使用&>>>>&形式。