“&>”和“>&”的区别

Quo*_*ans 2 bash

根据文档:

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)

没有输出,文件中插入了一个空字符串。>& 和 &> 不应该是一样的吗?

Kus*_*nda 7

总结:在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