0

我正在阅读BashFAQ/002并遇到以下重定向案例。我已经写了我对每个案例的理解,所以如果我错了,请发表评论。

情况1

output=$(command 2>&1 >/dev/tty)

重定向stderrstdout和重定向stdouttty. 所以,现在都stdout and stderr重定向/输出到终端。

案例2

output=$(command 2>&1 >/dev/null)

重定向stderrstdout和重定向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 并指出相关文档。

4

3 回答 3

2

将数据发送到 /dev/null 表示您不关心结果(例如,您只想执行操作)

情况 3 & 4:每个打开的文件都被分配一个文件描述符。stdin、stdout 和 stderr 的文件描述符分别为 0、1 和 2。为了打开其他文件,还有描述符 3 到 9。http://www.tldp.org/LDP/abs/html/io-redirection.html

于 2012-10-20T08:03:37.570 回答
2

案例 1 和 2 不符合您的描述。在这两种情况下,stderr将被重定向到之前stdout链接到的任何内容。即在这两种情况下,将存储打印到的任何内容,并分别重定向到和。(另请参见此处,以及此处的 bash 文档) stdoutoutputcommandstderrstdout/dev/tty/dev/null

3只是另一个文件描述符。它没有什么“魔法”,应用程序/命令/脚本定义了它的作用。

-对于末尾带有 a 的表单,请参阅 REDIRECTION 和Moving File Descriptors下的 bash 文档,以及I/O 和 I/O 重定向的详细介绍

于 2012-10-20T08:04:54.647 回答
1

2>&1意味着您在 stderr 上复制 stdout,即您将 stderr 重定向到 stdout 当前指向的位置(让我们通过将其称为“stdout 的位置”来简化它)。

这种重定向类似于按值传递,而不是按引用传递。因此,当您稍后重定向 stdout 时,stderr 也不会重定向。

为了说明,与output=$(command 2>&1 >/dev/tty)

  • 2>&1将 stderr 重定向到 stdout 的位置。
  • >/dev/tty将 stdout 重定向到/dev/tty,而 stderr 保持不变。

FD 3-9 可以随心所欲地使用,例如临时存储其他 FD 的位置或指向文件。

在案例 3 中,FD3 用于临时存储 stderr 的位置,同时 stderr 的位置和 stdout 的位置正在切换。

注意

  • 1>&3-将 FD3 的位置复制到 stderr,然后关闭 FD3
  • 3>&-关闭 FD3

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

于 2012-10-20T09:28:30.370 回答