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,在哪里M和N是文件描述符.
在上面的代码片段,不M=1和N='compiler.txt'?这究竟与以下有何不同:
gcc -c -g program.c > compiler.txt (ampersand removed)
Run Code Online (Sandbox Code Playgroud)
我的理解是每个打开的文件都与大于2的文件描述符相关联.这是正确的吗?
如果是这样,文件名是否可与其文件描述符互换作为重定向目标?
jor*_*anm 82
这是一样的&>.从bash手册页:
重定向标准输出和标准错误此结构允许将标准输出(文件描述符1)和标准错误输出(文件描述符2)重定向到名称为单词扩展的文件.
Run Code Online (Sandbox Code Playgroud)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
Tom*_*ale 12
&>vs >&: 首选版本是&>(clobber)关于:
&>>&两者都会破坏文件 - 在写入文件之前将其截断为 0 字节,就像> file在仅使用 STDIN 的情况下一样。
但是,bash手动重定向部分补充说:
在这两种形式中,首选第一种。这在语义上等同于
Run Code Online (Sandbox Code Playgroud)>word 2>&1使用第二种形式时,单词可能不会扩展为数字或
-。如果是这样,出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。
(注:在zsh这两个是等价的。)
以第一种 ( &>) 形式获取手指记忆是非常好的做法,因为:
&>>as>>&不受bash(append) 支持只有一种附加形式:
附加标准输出和标准错误的格式是:
Run Code Online (Sandbox Code Playgroud)&>>word这在语义上等同于
Run Code Online (Sandbox Code Playgroud)>>word 2>&1(请参阅下面的复制文件描述符)。
笔记:
&>过>&的部分上方再次推荐给有在附加只有一个办法bash。zsh允许&>>和>>&形式。