Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
简单linux重定向_Linux_Bash_Redirect_Terminal - Fatal编程技术网

简单linux重定向

简单linux重定向,linux,bash,redirect,terminal,Linux,Bash,Redirect,Terminal,我现在正在学习bash,我遇到了一些我无法理解的事情。 在这一行: exec 3>&1>日志;回声‘你好!’;执行1>和3>和- 为什么最后需要1>&3?如果我排除它,似乎我在终端中写的所有内容都会直接进入日志文件。为什么3>&-不足以关闭FD 这一定是个愚蠢的问题,但我已经开始学这么多了 exec 3>&1 >log; echo 'Hello!'; exec 1>&3 3>&- 此行首先将stdout(1)保存到新的文件描述符(3)中,

我现在正在学习bash,我遇到了一些我无法理解的事情。 在这一行:

exec 3>&1>日志;回声‘你好!’;执行1>和3>和-

为什么最后需要
1>&3
?如果我排除它,似乎我在终端中写的所有内容都会直接进入日志文件。为什么
3>&-
不足以关闭FD

这一定是个愚蠢的问题,但我已经开始学这么多了

    exec 3>&1 >log; echo 'Hello!'; exec 1>&3 3>&-
此行首先将stdout(1)保存到新的文件描述符(3)中,并创建文件“log”并将其分配给stdout。然后,使用此设置执行回显,从描述符3恢复旧标准输出,并通过关闭描述符3进行清理

1> &3通过将描述符1重定向到描述符3来还原描述符1

注意,exec的重定向和打开/关闭的文件描述符的效果在shell中执行之后仍然存在。因此,不管描述符用于什么,它的状态都应该恢复到正常状态

另外,请注意,在两个执行者的问题中,方向的顺序。如果您喜欢:

    exec >log 3>&1; echo 'Hello!'; exec 1>&3 3>&-


这行不通。在第一种情况下,描述符3也将指向文件“log”,描述符1将丢失。在第二个注释中,您将在恢复描述符3之前关闭它,描述符1将再次丢失。

这肯定是一个仅链接的注释,但它是一个很好的资源;检查。我认为您缺少的要点是,当您执行
3>&1
时,文件描述符3不会指向
fd1
,而是指向指向
fd1
的位置。因此
3>&-
足以关闭
fd3
,但它不会影响将
fd1
重定向回最初指向的位置(即
/dev/stdout
    exec 3>&1 >log; echo 'Hello!'; exec 3>&- 1>&3