前言
exec > >(tee -a ) 2>&1 命令
Operating System: Ubuntu 22.04.4 LTS
介绍
这个命令是一个 Bash 的重定向组合,用于将脚本的标准输出(stdout)和标准错误(stderr)同时输出到终端和日志文件中。下面我们逐步解析它的各个部分:
exec
的作用
exec
是 Bash 的内置命令,通常用于:
- 替换当前 Shell 进程(如
exec ls
会直接用ls
替换当前 Shell,执行后退出)。 - 修改当前 Shell 的文件描述符(如这里的重定向)。
在这里,exec
的作用是修改当前脚本的标准输出和标准错误的指向,而不是启动新进程。
> >(tee -a "$LOG")
这部分是核心的重定向逻辑:
- **第一个
>
**:表示重定向标准输出(stdout)。 >(...)
:这是一个 Bash 的进程替换(Process Substitution),会将...
部分的命令作为一个虚拟文件(通常是 FIFO 管道)传递。- **
tee -a "$LOG"
**:tee
:读取输入并同时输出到终端和文件。-a
:追加模式(append),避免覆盖日志文件。"$LOG"
:日志文件路径。
效果:标准输出会被重定向到 tee
命令,tee
会将其内容:
- 打印到终端(保留输出可见)。
- 追加到日志文件
$LOG
中。
2>&1
这部分将标准错误(stderr,文件描述符 2
)重定向到标准输出(stdout,文件描述符 1
)的当前位置:
- 由于之前标准输出已经重定向到
tee
,因此标准错误也会被tee
处理。 - 效果:标准错误也会同时显示在终端并追加到日志文件。
完整解释
整个命令的作用是:
- 将当前 Shell 的标准输出重定向到
tee -a "$LOG"
,使得输出既显示在终端,又追加到日志文件$LOG
。 - 将标准错误也重定向到标准输出的位置(即同样通过
tee
处理)。 - 最终实现:脚本的所有输出(stdout + stderr)同时在终端显示和日志文件中保存。
注意事项
- 进程替换
>(...)
是 Bash 的特性,其他 Shell(如sh
)可能不支持。 - 日志文件权限:需确保脚本有权限写入
$LOG
指定的路径。 - 缓冲问题:某些情况下,
tee
的输出可能有缓冲,可通过stdbuf
工具调整(如tee
前加stdbuf -oL
)。
等价写法
如果不用 exec
,也可以在脚本中每一句手动重定向:
command1 | tee -a "$LOG"
command2 2>&1 | tee -a "$LOG"
但 exec
更高效,因为它一次性重定向后续所有命令的输出。
应用场景
- 脚本日志记录:同时查看实时输出并保存日志。
- 调试:保留错误和正常输出的完整上下文。
结语
第三百二十七篇博文写完,开心!!!!
今天,也是充满希望的一天。