只是想知道以下之间是否有任何区别:
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 所在的位置目前使用。
请注意,我的术语可能是错误的(“指向”等)。这就是我记得重定向是如何工作的。