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

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

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

  echo "running the npm patch" >&2;

 echo "running the npm patch" &>2;

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

答案1

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


cmd >&2形式在“3.6.8 复制文件描述符”部分中描述

[n]>&word

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


cmd &>2形式在“3.6.4 重定向标准输出和标准错误”部分中描述

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

&>word

>&word

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

>word 2>&1

在本例中,“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

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

$ sh -c 'echo stdout; echo stderr >&2' >&2 2>some.file
stdout
$ cat some.file
stderr

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

从左到右:

  • 1>&2-- 我认为这是“将文件描述符 1 重定向到无论文件描述符 2 当前使用什么”。目前,fd 2 指向/dev/stderr。所以现在,fd 1 也指向/dev/stderr。
  • 2>some.file-- 我们更改 fd 2 以写入指定文件。这确实不是改变 fd 1 当前使用的内容。

如果我们要改变命令的重定向,我们会得到不同的结果:

$ sh -c 'echo stdout; echo stderr >&2' 2>some.file >&2
$ cat some.file 
stdout
stderr

因为我们改变了fd 2第一的然后将 fd 1 重定向到 fd 2 所在的位置目前使用

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

相关内容