前言
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 更高效,因为它一次性重定向后续所有命令的输出。
应用场景
- 脚本日志记录:同时查看实时输出并保存日志。
- 调试:保留错误和正常输出的完整上下文。
结语
第三百二十七篇博文写完,开心!!!!
今天,也是充满希望的一天。