>&2 和 &>2 有什么区别

Ale*_*lls 6 bash io-redirection stderr

只是想知道以下之间是否有任何区别:

  echo "running the npm patch" >&2;
Run Code Online (Sandbox Code Playgroud)

 echo "running the npm patch" &>2;
Run Code Online (Sandbox Code Playgroud)

我实际上从来没有真正理解这种语法。

gle*_*man 13

仔细阅读手册的重定向部分:https : //www.gnu.org/software/bash/manual/bashref.html#Redirections


cmd >&2表单在“3.6.8 复制文件描述符”一节中描述

[n]>&word
Run Code Online (Sandbox Code Playgroud)

此处n未指定,因此默认为“1”,表示标准输出:我们将标准输出重定向到文件描述符“2”,表示标准错误。命令的所有正常输出都将发送到 stderr。


cmd &>2表单在“3.6.4 重定向标准输出和标准错误”一节中描述

重定向标准输出和标准错误有两种格式:

&>word
Run Code Online (Sandbox Code Playgroud)

>&word
Run Code Online (Sandbox Code Playgroud)

在这两种形式中,首选第一种。这在语义上等同于

>word 2>&1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,“word”是“2”,因此我们将命令中的 stdout 和 stderr 发送到名为2.

$ sh -c 'echo stdout; echo stderr >&2' &>2
$ ls -l 2
-rw-rw-r-- 1 jackman jackman 14 May 14 21:40 2
$ cat 2
stdout
stderr
Run Code Online (Sandbox Code Playgroud)

我在学习时发现这一切都非常令人困惑。坚持下去。请记住,重定向以严格的从左到右的顺序发生。例如

$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr
Run Code Online (Sandbox Code Playgroud)

为什么不将“stdout”字符串发送到该文件?

从左到右:

  • 1>&2-- 我认为这是“将文件描述符 1 重定向到当前使用的任何文件描述符 2 ”。目前,fd 2 指向 /dev/stderr。所以现在,fd 1 也指向 /dev/stderr。
  • 2>some.file-- 我们将 fd 2 更改为写入命名文件。这并没有改变1,目前使用的是什么区FD。

如果我们改变重定向的顺序,我们会得到不同的结果:

$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file 
stdout
stderr
Run Code Online (Sandbox Code Playgroud)

因为我们改变的fd 2然后将 fd 1 重定向到 fd 2当前正在使用的任何内容。

请注意,我的术语可能是错误的(“指向”等)。这就是我记得重定向如何工作的方式。

  • 请注意,`&>2` 是一种bashism,并且违反了shell 语言规范,该规范要求将`cmd &> word` 视为与`cmd & > word` 相同。(异步运行 cmd,然后是第二个以重定向开头的命令列表。) (2认同)