我试图在以下代码中了解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)将把标准输出重定向到>(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的存在,日志文件的内容被复制到终端。
你能帮我理解这几点吗?
谢谢。
发布于 2021-02-14 02:59:46
逗号的一般形式是exec > output,它使所有进一步的输出都被发送到文件" output“。
这可以扩展;例如exec 2> error将导致所有进一步输出到stderr发送到文件"error“。
现在,>(...)是一种bashism,它意味着将输出写入命令;在本例中,该命令是"tee“。
所以我们把两者加在一起。
exec > >(tee logfile)的意思是“将所有进一步的输出写入命令tee logfile”。
这意味着所有未来的输出将被发送到屏幕并(通过tee)发送到"logfile“文件。
https://unix.stackexchange.com/questions/634350
复制相似问题