Bash:解释以下重定向情况
我正在阅读并偶然发现了以下重定向案例。我已经写下了我对每个案例的理解,所以如果我错了,请评论 案例1Bash:解释以下重定向情况,bash,io-redirection,Bash,Io Redirection,我正在阅读并偶然发现了以下重定向案例。我已经写下了我对每个案例的理解,所以如果我错了,请评论 案例1 output=$(command 2>&1 >/dev/tty) 将stderr重定向到stdout,然后将stdout重定向到tty。所以,现在stdout和stderr都重定向/输出到终端 案例2 output=$(command 2>&1 >/dev/null) 将stderr重定向到stdout,然后将stdout重定向到/dev/null。虽
output=$(command 2>&1 >/dev/tty)
将stderr
重定向到stdout
,然后将stdout
重定向到tty
。所以,现在stdout和stderr都重定向/输出到终端
案例2
output=$(command 2>&1 >/dev/null)
将stderr
重定向到stdout
,然后将stdout
重定向到/dev/null
。虽然我不明白这样做的意义,因为现在stderr和stdout都被丢弃了
案例3
output=$(command 3>&2 2>&1 1>&3-)
不知道这里到底发生了什么。我不知道fd3
案例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 将数据发送到/dev/null表示您不关心结果(例如,您只想执行操作)
案例3和4:为每个打开的文件分配一个文件描述符。stdin、stdout和stderr的文件描述符分别为0、1和2。对于打开其他文件,仍然有描述符3到9 案例1和案例2与您描述的不同。在这两种情况下,
stderr
将被重定向到重定向stdout
之前链接到的任何stdout
。i、 e.在这两种情况下,output
将存储打印到stderr
的任何命令,并且stdout
分别重定向到/dev/tty
和/dev/null
。(另请参见和bash文档)
3
只是另一个文件描述符。它没有什么“魔力”,应用程序/命令/脚本定义了它的功能
对于末尾带有-
的表单,请参阅重定向和和下的bash文档。案例1和案例2不符合您的描述。在这两种情况下,stderr
将被重定向到重定向stdout
之前链接到的任何stdout
。i、 e.在这两种情况下,output
将存储打印到stderr
的任何命令,并且stdout
分别重定向到/dev/tty
和/dev/null
。(另请参见和bash文档)
3
只是另一个文件描述符。它没有什么“魔力”,应用程序/命令/脚本定义了它的功能
对于末尾带有-
的表单,请参阅重定向和和下的bash文档。2>&1
表示您正在复制stderr上的stdout,也就是说,您正在将stderr重定向到stdout当前指向的位置(让我们通过将其称为“stdout的位置”来简化)
此重定向类似于按值传递,而不是按引用传递。因此,当您稍后重定向stdout时,stderr也不会得到重定向
举例来说,使用output=$(命令2>&1>/dev/tty)
2>&1
将stderr重定向到stdout的位置李>
/dev/tty
将stdout重定向到/dev/tty
,而stderr保持不变李>
FDs 3-9可根据需要使用,例如临时存储其他FD的位置或指向文件
在情况3中,FD3用于在切换stderr的位置和stdout的位置时临时存储stderr的位置
注意:
1>&3-
将FD3的位置复制到stderr,然后关闭FD3
3>&-
关闭FD3
案例4与案例3基本相同<案例4中使用的code>exec 3>&1
将对当前shell中的所有后续命令产生影响(直到用exec 3>&-
关闭),而案例3中的3>&1
仅将重定向限制为命令
。2>&1
表示您正在stderr上复制stdout,也就是说,您正在将stderr重定向到stdout当前指向的位置(让我们通过将其称为“stdout的位置”来简化此操作)
此重定向类似于按值传递,而不是按引用传递。因此,当您稍后重定向stdout时,stderr也不会得到重定向
举例来说,使用output=$(命令2>&1>/dev/tty)
2>&1
将stderr重定向到stdout的位置李>
/dev/tty
将stdout重定向到/dev/tty
,而stderr保持不变李>
FDs 3-9可根据需要使用,例如临时存储其他FD的位置或指向文件
在情况3中,FD3用于在切换stderr的位置和stdout的位置时临时存储stderr的位置
注意:
1>&3-
将FD3的位置复制到stderr,然后关闭FD3
3>&-
关闭FD3
案例4与案例3基本相同<案例4中使用的code>exec 3>&1
将对当前shell中的所有后续命令产生影响(直到使用exec 3>&-
关闭为止),而案例3中的3>&1
仅将重定向限制为命令
。案例2:“因为现在stderr和stdout都被丢弃”-这是发送到/dev/null的点-丢弃它^。只有stdout被重定向到/dev/null
案例2:“因为现在stderr和stdout都被丢弃了”——这就是发送到/dev/nu的点