00327 exec > >(tee -a ) 2>&1 命令


前言

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 会将其内容:

  1. 打印到终端(保留输出可见)。
  2. 追加到日志文件 $LOG 中。

2>&1

这部分将标准错误(stderr,文件描述符 2)重定向到标准输出(stdout,文件描述符 1)的当前位置:

  • 由于之前标准输出已经重定向到 tee,因此标准错误也会被 tee 处理。
  • 效果:标准错误也会同时显示在终端并追加到日志文件。

完整解释

整个命令的作用是:

  1. 将当前 Shell 的标准输出重定向到 tee -a "$LOG",使得输出既显示在终端,又追加到日志文件 $LOG
  2. 将标准错误也重定向到标准输出的位置(即同样通过 tee 处理)。
  3. 最终实现:脚本的所有输出(stdout + stderr)同时在终端显示和日志文件中保存

注意事项

  1. 进程替换 >(...) 是 Bash 的特性,其他 Shell(如 sh)可能不支持。
  2. 日志文件权限:需确保脚本有权限写入 $LOG 指定的路径。
  3. 缓冲问题:某些情况下,tee 的输出可能有缓冲,可通过 stdbuf 工具调整(如 tee 前加 stdbuf -oL)。

等价写法

如果不用 exec,也可以在脚本中每一句手动重定向:

command1 | tee -a "$LOG"
command2 2>&1 | tee -a "$LOG"

exec 更高效,因为它一次性重定向后续所有命令的输出。


应用场景

  • 脚本日志记录:同时查看实时输出并保存日志。
  • 调试:保留错误和正常输出的完整上下文。

结语

第三百二十七篇博文写完,开心!!!!

今天,也是充满希望的一天。


文章作者: LuYF-Lemon-love
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LuYF-Lemon-love !
  目录