2012-10-20 47 views
0

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

案例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并指向相关文档。

+0

案例2:'因为现在stderr和stdout都被丢弃' - _that_是发送到/ dev/null的点 - 丢弃它 – mcalex

+1

^不正确。只有stdout被重定向到'/ dev/null' – doubleDown

回答

2

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

案例3 & 4:每个打开的文件被分配的文件描述符。 stdin,stdout和stderr的文件描述符分别为0,1和2。对于打开其他文件,仍有描述符3至9. http://www.tldp.org/LDP/abs/html/io-redirection.html

2

情况1和2不会执行您所描述的操作。在这两种情况下,stderr将重定向到stdout被链接到之前stdout被重定向。即在这两种情况下,output将存储打印到stderr的任何command,并且stdout分别被重定向到/dev/tty/dev/null。 (另请参阅here和bash文档here

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

最后请参阅REDIRECTION和Moving File DescriptorsA Detailed Introduction to I/O and I/O Redirection下的bash文档。

+0

谢谢,在阅读相关文档链接后会回来。 – RanRag

1

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

该重定向类似于按值传递,而不是通过引用传递。因此,稍后重定向stdout时,stderr也不会重定向。

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

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

3-9的FD可以使用但是你想,例如临时存储其他FD的位置或指向文件。

在情况3中,FD3用于临时存储stderr的位置,而stderr的位置和stdout的位置正在切换。

注意

  • 1>&3-副本FD3的位置到标准错误,然后关闭FD3
  • 3>&-关闭FD3

案例4几乎是一样的情形3 exec 3>&1所用在情况4中将影响当前shell中的所有后续命令(直到与exec 3>&-关闭),而情况3中的3>&1 limi仅重定向到command