IT-Swarm.Net

什么>&是什么意思?

我对这个表达有点困惑:

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

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

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

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

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

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

67
contrapositive

这与&>相同。从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
76
jordanm

快速,可靠且价格合理的云托管

注册并在30天内获得$50奖金!

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

关于:

  • &>
  • >&

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

但是 bash手动重定向部分 补充说:

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

>Word 2>&1

使用第二种形式时,Word可能不会扩展为数字或-。如果是,则应用其他重定向运算符(请参阅下面的重复文件描述符)以了解兼容性原因。.

(注意: zsh中都是等价的 。)

在第一个(&>)表单中获取手指记忆是非常好的做法,因为:

使用&>>作为>>&不被bash(追加)支持

只有一个附加形式:

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

&>>Word

这在语义上等同于

>>Word 2>&1

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

注意:

  • 鉴于只有一种方法可以在bash中附加,因此再次建议在上面一节中&>>&的使用。.
  • zsh允许&>>>>&表单。.
2
Tom Hale