exec和tee到日志文件:解释这些bash命令


15

我在bash脚本文件的顶部看到了这个:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1

它有什么作用?这两个执行程序在做什么?我意识到保持这样,脚本执行的所有输出都通过管道传递给了$LOGFILE我,但我想从exec语句的角度来理解。



1
你在顶部看到这个您的 bash脚本文件?;)
Sebb

1
这两exec行很可能只是一个(exec > >(tee "$LOGFILE") 2>&1)。
乔纳森·勒夫勒

Answers:


18

在shell中,exec执行1)文件打开和重定向2)实际执行exec(用另一个过程映像替换当前过程映像)。

这些exec是重定向。

首先,您将(exec 1> >(tee $LOGFILE)stdout描述符(1)重定向到连接到并发运行的tee进程的进程替换生成的管道,该管道具有$LOGFILE第一个参数,然后将stderr描述符(2)重定向到描述符1现在指向的位置(三通管)。

请记住,文件描述符是继承的,您已经将所有将来的内容stdoutstderr输出转到了该tee过程,该过程将它写入$LOGFILE文件描述符1最初指向的位置以及可能指向的位置(可能是您的终端)。


注意: tee进程输出到原始stdout(=原始文件描述符1),因为您可以从/ ashing bash(1)中学习简单命令扩展进程替换,因此,进程替换(>() <())和其他扩展一起发生重定向得到执行,这意味着重定向在启动exec 1> >(tee "$LOGFILE")发生 tee并保留tee了从父外壳继承的文件描述符1。(如果相反,tee则将写入其自己的输入,这可能使其死锁,具体取决于其IO模式)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.