我正在阅读BashFAQ/002,遇到了以下重定向案例。我已经写了我对每个案例的理解,所以如果我错了,请发表评论。
案例1
output=$(command 2>&1 >/dev/tty)
将stderr
重定向到stdout
,然后将stdout
重定向到tty
。因此,现在两个stdout and stderr
都将重定向/输出到终端。
案例2
output=$(command 2>&1 >/dev/null)
将stderr
重定向到stdout
,然后将stdout
重定向到/dev/null
。虽然我不明白这样做的意义,因为现在两个stderr and stdout
都被丢弃了。
案例3
output=$(command 3>&2 2>&1 1>&3-)
不,知道这里发生了什么。我不知道fd 3
.
案例4
exec 3>&1
output=$(command 2>&1 1>&3)
exec 3>&-
不,又是想法。
那么,有人可以详细向我解释案例#3和案例#4,并向我指出相关文档。
将数据发送到/dev/null 表示您不关心结果(例如,您只想执行操作)
情况3和4:每个打开的文件都被分配一个文件描述符。 stdin、stdout 和 stderr 的文件描述符分别为 0、1 和 2。对于打开其他文件,保留描述符 3 到 9。http://www.tldp.org/LDP/abs/html/io-redirection.html
情况 1 和 2 不执行您所描述的操作。在这两种情况下,stderr
都将重定向到重定向之前链接到stdout
stdout
。也就是说,在这两种情况下,output
将存储打印到stderr
的任何command
,并且stdout
分别重定向到/dev/tty
和/dev/null
。(另请参阅此处,以及此处的 bash 文档)
3
只是另一个文件描述符。它没有什么"魔力",应用程序/命令/脚本定义了它的作用。
有关末尾带有-
的表单,请参阅重定向和移动文件描述符下的 bash 文档,以及 I/O 和 I/O 重定向的详细说明。
2>&1
意味着你在stderr上复制stdout,即你正在将stderr重定向到stdout当前指向的位置(让我们通过称之为"stdout的位置"来简化这一点)。
此重定向类似于按值传递,而不是按引用传递。因此,当您稍后重定向标准输出时,stderr也不会重定向。
举例来说,用output=$(command 2>&1 >/dev/tty)
2>&1
将stderr重定向到stdout的位置。>/dev/tty
将标准输出重定向到/dev/tty
,而标准输出保持不变。
FDs 3-9可以随心所欲地使用,例如临时存储其他FD的位置或指向文件。
在案例 3 中,FD3 用于临时存储 stderr 的位置,同时切换 stderr 的位置和 stdout 的位置。
注:
1>&3-
将FD3的位置复制到stderr,然后关闭FD33>&-
关闭FD3
案例4 与案例 3 几乎相同。 案例 4 中使用的exec 3>&1
将对当前 shell 中的所有后续命令产生影响(直到以exec 3>&-
关闭),而案例 3 中的3>&1
将重定向限制为仅command
。