什么>&是什么意思?

con*_*ive 71 io bash file-descriptor io-redirection

我对这个表达有点困惑:

gcc -c -g program.c >& compiler.txt
Run Code Online (Sandbox Code Playgroud)

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

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

gcc -c -g program.c > compiler.txt     (ampersand removed)
Run Code Online (Sandbox Code Playgroud)

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

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

jor*_*anm 82

这是一样的&>.从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
Run Code Online (Sandbox Code Playgroud)

  • @geneorama`&> word`,`> word 2>&1`,*和*`>&word`完全相同. (8认同)
  • 我觉得很愚蠢.我花了很多时间阅读其他来源,它就在联机帮助页面中. (4认同)
  • `>&`是csh和tcsh用来重定向stdout和stderr的语法.这可能就是bash接受它的原因. (2认同)
  • 这是否意味着`&> word`和`> word 2>&1`在语义上是等效的?我不清楚“这个”的前提。 (2认同)

Tom*_*ale 12

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

关于:

  • &>
  • >&

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

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

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

>word 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

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

使用&>>as>>&不受bash(append) 支持

只有一种附加形式:

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

&>>word
Run Code Online (Sandbox Code Playgroud)

这在语义上等同于

>>word 2>&1
Run Code Online (Sandbox Code Playgroud)

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

笔记:

  • 的撞使用&>>&的部分上方再次推荐给有在附加只有一个办法bash
  • zsh允许&>>>>&形式。