根据文档:
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)
但是,当我运行这些命令时:
echo abc 2>&1 | tee myfile
Run Code Online (Sandbox Code Playgroud)
我得到 abc 并将其流式传输到文件中。
但与:
echo abcd 2&>1 | tee myfile
Run Code Online (Sandbox Code Playgroud)
没有输出,文件中插入了一个空字符串。>& 和 &> 不应该是一样的吗?
总结:在bashshell中,>&和之间没有区别&>,但是你展示的代码中的重定向是不同的。
在您的第一段代码中,您使用2>&1(“将标准错误重定向到标准输出的任何地方”)。
然后你会问为什么这与使用2&>1if>&和&>are same 不同。
bash您引用的文档专门针对重定向运算符&>word和>&word. 这些与标准重定向相同>word 2>&1,在文档中也有提到。请注意,这里没有提到文件描述符,手册没有写[n]&>word或[n]>&word其他一些重定向操作符(不清楚这意味着什么,因为两个重定向操作符已经隐含地涉及标准输入和标准错误)。
只有您的两个命令中的第二个,使用2&>1,使用这些重定向运算符之一,并且它不会按照您的想法进行解释。第一个命令echo abcd 2>&1没有使用特殊的非标准重定向,>&因为它后面紧跟一个数字。手册特别提到了这一点:
使用第二种形式时,
word可能不会扩展为数字或-。如果是这样, 出于兼容性原因,其他重定向运算符将适用(请参阅下面的复制文件描述符)。
您的第二个命令echo abcd 2&>1与 相同echo abcd 2 &> 1,即“echo使用两个参数abcdand调用2,并将标准输出和标准错误写入名为 的文件” 1。