Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:解释以下重定向情况_Bash_Io Redirection - Fatal编程技术网

Bash:解释以下重定向情况

Bash:解释以下重定向情况,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。虽

我正在阅读并偶然发现了以下重定向案例。我已经写下了我对每个案例的理解,所以如果我错了,请评论

案例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
。虽然我不明白这样做的意义,因为现在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的点