我在 bash 脚本文件的顶部看到了这个:
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
Run Code Online (Sandbox Code Playgroud)
它有什么作用?两个 exec 进程在这里做什么?我意识到保持这样,脚本执行的所有输出都通过管道传输,$LOGFILE但我想从exec语句的角度来理解。
PSk*_*cik 19
在 shell 中,exec执行 1) 文件打开和重定向 2) 实际操作exec(用另一个进程映像替换当前进程映像)。
这些exec是重定向。
首先,您将 ( exec 1> >(tee $LOGFILE))stdout描述符 (1)重定向到进程替换生成的管道,该管道连接到并发运行的tee进程,$LOGFILE该进程将其作为第一个参数,然后将stderr描述符 (2)重定向到描述符1现在指向的位置(tee管道)。
请记住,文件描述符是继承的,您只是将所有未来stdout和stderr输出都交给了tee进程,该进程将其写入$LOGFILE并写入文件描述符 1 最初指向的任何地方(可能是您的终端)。
注意:
tee 进程输出到原始标准输出(=原始文件描述符 1),因为正如您可以从 /searching bash(1) for Simple Command Expansion and Process Substitution 中了解到的,进程替换 ( >() <()) 发生在之前(以及其他扩展)重定向被执行,这意味着重定向在开始之后exec 1> >(tee "$LOGFILE")发生,留下与它从父 shell 继承的相同的文件描述符 1。(如果是相反的方式,将使其写入自己的输入,这可能会导致死锁,具体取决于其 IO 模式)。 teeteetee
| 归档时间: |
|
| 查看次数: |
6620 次 |
| 最近记录: |