简单linux重定向
我现在正在学习bash,我遇到了一些我无法理解的事情。 在这一行:简单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)中,
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