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 重定向标准输出和标准错误”一节中描述
重定向标准输出和标准错误有两种格式:
Run Code Online (Sandbox Code Playgroud)&>word
和
Run Code Online (Sandbox Code Playgroud)>&word
在这两种形式中,首选第一种。这在语义上等同于
Run Code Online (Sandbox Code Playgroud)>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
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当前正在使用的任何内容。
请注意,我的术语可能是错误的(“指向”等)。这就是我记得重定向如何工作的方式。