理解exec>>(命令)

理解exec>>(命令)

exec > >(tee logfile)我正在尝试了解以下代码的效果:

#!/bin/bash                                                                                                                 

exec 7>&1           # save stdout for later reset                                                                           

exec > >(tee logfile)          # point stdout to FIFO pointing to tee command?                                              
#+expect any subsequent output to stdout to be sent                                                                         
#+both to stdout and logfile.                                                                                               

# so let's send some output                                                                                                 
echo
echo howdy             # expect these strings to be sent both to terminal and                                               
echo g\'day            #+logfile                                                                                            
echo hello!

# restore stdout                                                                                                            
exec 1>&7
exec 7>&-

#check content of logfile!                                                                                                  
echo ------------
cat logfile

我只是猜测这里exec > >(tee logfile)会将 stdout 重定向到>(tee logfile).

这是运行此脚本时终端的输出:

--------------------

howdy
g'day
hello!

howdy
g'day
hello!

这是日志文件的内容:


howdy
g'day
hello!

看来我尝试将 stdout 重定向回终端没有效果:exec 1>&7。也许,exec 1>&7发生在日志文件被写入并将其内容发送到终端之后。

而且我不明白执行脚本时终端的输出。我猜在阅读它exec > >(tee logfile)之前会被阻止。cat logfile然后日志文件的内容由于tee logfile.

你能帮我理解这些要点吗?

谢谢。

答案1

该命令的一般形式是,exec > output它使所有到 stdout 的进一步输出被发送到文件“output”。

这个可以延长;例如exec 2> error将导致所有进一步的输出到 stderr 被发送到文件“错误”

现在,>(...)是一个bashism,意味着将输出写入命令;在这种情况下,命令是“tee logfile”

所以我们将两者加在一起。

exec > >(tee logfile)意思是“将所有进一步的输出写入命令tee logfile”。

这意味着所有未来的输出都将发送到屏幕(通过tee)到文件“logfile”

答案2

我现在知道了。

$ exec 7>&1
$ exec > >(tee logfile)
$ ls -l /proc/self/fd
fd/     fdinfo/ 
logan@logan-mainPC:~/my-test/learning-process-substitution$ ls -l /proc/self/fd
total 0
lrwx------ 1 logan logan 64 Feb 14 15:40 0 -> /dev/pts/0
l-wx------ 1 logan logan 64 Feb 14 15:40 1 -> pipe:[9603908]
lrwx------ 1 logan logan 64 Feb 14 15:40 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:40 3 -> /proc/398229/fd
lrwx------ 1 logan logan 64 Feb 14 15:40 7 -> /dev/pts/0
$ echo hi i will restore stdout now
hi i will restore stdout now
$ exec 1>&7
$ exec 7>&-
$ ls -l /proc/self/fd
total 0
lrwx------ 1 logan logan 64 Feb 14 15:41 0 -> /dev/pts/0
lrwx------ 1 logan logan 64 Feb 14 15:41 1 -> /dev/pts/0
lrwx------ 1 logan logan 64 Feb 14 15:41 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:41 3 -> /proc/398237/fd
$ cat logfile 
total 0
lrwx------ 1 logan logan 64 Feb 14 15:40 0 -> /dev/pts/0
l-wx------ 1 logan logan 64 Feb 14 15:40 1 -> pipe:[9603908]
lrwx------ 1 logan logan 64 Feb 14 15:40 2 -> /dev/pts/0
lr-x------ 1 logan logan 64 Feb 14 15:40 3 -> /proc/398229/fd
lrwx------ 1 logan logan 64 Feb 14 15:40 7 -> /dev/pts/0
hi i will restore stdout now

相关内容