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