>& 是啥意思?
Posted
技术标签:
【中文标题】>& 是啥意思?【英文标题】:What does >& mean?>& 是什么意思? 【发布时间】:2012-06-30 14:39:48 【问题描述】:我被这句话弄糊涂了:
gcc -c -g program.c >& compiler.txt
我知道&>filename
会将标准输出和标准错误重定向到文件filename
。但在这种情况下,& 符号位于大于号之后。它看起来像M>&N
的形式,其中M
和N
是文件描述符。
在上面的 sn-p 中,M=1
和 N='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。以上是关于>& 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章