Bash:解释以下重定向案例

时间:2012-10-20 07:56:24

标签: bash io-redirection

我正在阅读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并指出相关文档。

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

案例1和案例2没有按照您的描述进行。在这两种情况下,stderr都会重定向到 stdout重定向之前与相关联的任何stdout。即,在这两种情况下,output将存储打印到command的{​​{1}},stderr分别重定向到stdout/dev/tty。 (另请参阅here和bash文档here

/dev/null只是另一个文件描述符。关于它没有任何“魔力”,应用程序/命令/脚本定义了它的作用。

对于最后带3的表单,请参阅REDIRECTION和Moving File Descriptors以及A Detailed Introduction to I/O and I/O Redirection下的bash文档。

答案 2 :(得分: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几乎相同。案例4中使用的exec 3>&1会对当前shell中的所有后续命令产生影响(直到用exec 3>&-关闭),而{3>&1情况3中的1}}仅将重定向限制为command