我在 bash 脚本文件的顶部看到了这一点:
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
它有什么作用?两个exec进程在这里做什么?我意识到保持这样,脚本执行的所有输出都会通过管道传输,$LOGFILE
但我想从exec
语句的角度来理解。
答案1
在 shell 中,exec
执行 1) 文件打开和重定向 2) 实际exec
操作(用另一个进程映像替换当前进程映像)。
这些exec
是重定向。
首先,将描述符 (1) 重定向 ( exec 1> >(tee $LOGFILE)
)stdout
到进程替换生成的管道,该管道连接到并发运行的tee
进程(该进程具有$LOGFILE
第一个参数),然后将stderr
描述符 (2) 重定向到描述符现在指向的同一位置1
(tee管道)。
请记住,文件描述符是继承的,您刚刚将所有 futurestdout
和stderr
输出都发送到进程tee
,该进程将其写入$LOGFILE
文件描述符 1 最初指向的任何位置(可能是您的终端)。
笔记:
tee 进程输出到原始标准输出(=原始文件描述符 1),因为,正如您可以从 /searching 中了解到的重击(1)为了简单的命令扩展和流程替代,进程替换 ( >()
<()
) 在执行重定向之前发生(以及其他扩展),这意味着重定向exec 1> >(tee "$LOGFILE")
发生后 tee
已启动,并保留tee
从父 shell 继承的相同文件描述符 1。 (如果是相反的情况,tee
则会写入自己的输入,这可能会导致死锁,具体取决于其 IO 模式)。