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

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

我在 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管道)。

请记住,文件描述符是继承的,您刚刚将所有 futurestdoutstderr输出都发送到进程tee,该进程将其写入$LOGFILE文件描述符 1 最初指向的任何位置(可能是您的终端)。


笔记: tee 进程输出到原始标准输出(=原始文件描述符 1),因为,正如您可以从 /searching 中了解到的重击(1)为了简单的命令扩展流程替代,进程替换 ( >() <()) 在执行重定向之前发生(以及其他扩展),这意味着重定向exec 1> >(tee "$LOGFILE")发生 tee已启动,并保留tee从父 shell 继承的相同文件描述符 1。 (如果是相反的情况,tee则会写入自己的输入,这可能会导致死锁,具体取决于其 IO 模式)。

相关内容