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