Bash:解释以下重定向情况



我正在阅读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都将重定向到重定向之前链接到stdoutstdout。也就是说,在这两种情况下,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,然后关闭FD3
  • 3>&-关闭FD3

案例4 与案例 3 几乎相同。 案例 4 中使用的exec 3>&1将对当前 shell 中的所有后续命令产生影响(直到以exec 3>&-关闭),而案例 3 中的3>&1将重定向限制为仅command

相关内容

最新更新