我对这个表达有点困惑:
gcc -c -g program.c >& compiler.txt
我知道&>filename
会将stdout和stderr重定向到文件filename
。但在这种情况下,&符号在大于号之后。它看起来像M>&N
形式,其中M
和N
是文件描述符。
在上面的代码段中,是M=1
还是N='compiler.txt'
?这究竟与以下有何不同:
gcc -c -g program.c > compiler.txt (ampersand removed)
我的理解是每个打开的文件都与大于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
允许使用&>>
和>>&
形式。