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