>& 是啥意思?

Posted

技术标签:

【中文标题】>& 是啥意思?【英文标题】:What does >& mean?>& 是什么意思? 【发布时间】:2012-06-30 14:39:48 【问题描述】:

我被这句话弄糊涂了:

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

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

在上面的 sn-p 中,M=1N='compiler.txt'?这与以下具体有何不同:

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

我的理解是每个打开的文件都关联一个大于2的文件描述符,这样说对吗?

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

【问题讨论】:

【参考方案1】:

这与&> 相同。来自 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

【讨论】:

我觉得自己很愚蠢。我花了很多时间阅读其他资源,它就在手册页中。 >& 是 csh 和 tcsh 用于重定向 stdout 和 stderr 的语法。这可能就是 bash 接受它的原因。 这是否意味着&>word>word 2>&1 在语义上是等价的?我不清楚“This”的前因。 @geneorama &>word>word 2>&1 >&word完全一样。 现在根据我在别处看到的内容,我意识到我之前犯了一个错误。 > 仅重定向标准输出。 > 不重定向错误。 (我可能应该将我未来的 cmets 重定向到 /dev/null【参考方案2】:

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

关于:

&> >&

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

不过bash manual Redirections section 补充说:

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

>word 2>&1

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

(注:in zsh both are equivalent.)

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

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

只有一种追加形式:

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

&>>word

这在语义上等价于

>>word 2>&1

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

注意:

再次建议在上面的部分中使用&> 而不是>& 的clobber 用法,因为在bash 中追加只有一种方法。 zsh 允许 &>>>>& 表单。

【讨论】:

这个答案比赞成的答案更有帮助。 & 是一个特殊的字符,会被 shell 解释器转换为 1 和 2? @FakherMokadem 不,见the manual。

以上是关于>& 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

bash 中的“1>&2”是啥意思? [复制]

Bash:2>&1 是啥意思? [复制]

这里的“2>&1”是啥意思? [复制]

“somevar >> 0”是啥意思?

在shell中,“ 2>&1 ”是啥意思?

&nbsp是啥意思删了有影响吗