别再只用 > 了!Linux tee命令的5个实用场景,从日志记录到管道调试

在Linux命令行中,重定向操作符 > >> 几乎是每个用户最早掌握的技能之一。但当你需要同时查看命令输出并保存到文件时,这两个简单的符号就显得力不从心了。这就是 tee 命令大显身手的地方——它像水管工用的三通接头,将数据流同时导向屏幕和文件。

对于已经熟悉基础重定向的中级用户来说, tee 的价值远不止于"显示并保存"这么简单。本文将带你探索五个真实场景,从日志记录到管道调试,让这个看似简单的工具成为你命令行工具箱中的瑞士军刀。

1. 实时监控并保存长命令输出

编译大型项目、处理海量数据或执行长时间运行的脚本时,我们既需要实时查看进度,又希望保留完整的日志供后续分析。传统做法是先重定向到文件,再用 tail -f 查看,但这需要两个终端窗口。

# 传统方式(需要两个终端)
make > build.log &  # 后台运行
tail -f build.log   # 另一个终端查看

tee 让这一切变得简单:

make 2>&1 | tee build.log

关键点解析

  • 2>&1 将标准错误(stderr)合并到标准输出(stdout)
  • tee 同时输出到屏幕和文件
  • 追加模式使用 tee -a 避免覆盖原有日志

提示:对于需要实时监控的关键任务,可以结合 watch 命令定期执行并记录输出。

2. 调试复杂管道命令的中间结果

管道( | )是Linux的精华所在,但当多级管道串联时,调试中间结果往往令人头疼。你不得不多次执行命令,逐步构建管道链。 tee 提供了更优雅的解决方案:

# 原始复杂管道
cat access.log | grep "404" | awk '{print $7}' | sort | uniq -c | sort -nr

# 调试版 - 在任意阶段插入tee查看数据
cat access.log | grep "404" | tee debug1.txt | awk '{print $7}' | tee debug2.txt | sort | uniq -c | sort -nr

调试技巧

  1. 在每个管道阶段后插入 tee debugX.txt
  2. 检查各阶段的输出文件是否符合预期
  3. 确认问题后移除多余的 tee 命令

3. 多目标输出分发

有时我们需要将命令结果同时写入多个文件,或传递给多个后续命令。 tee 支持同时写入多个文件描述符:

# 同时写入三个文件
ls -l | tee file1.txt file2.txt file3.txt

# 结合进程替换(Process Substitution)实现更复杂的流转
diff <(ls /dir1 | tee >(grep .txt > txt_files.txt)) <(ls /dir2)

高级用法对比表

场景 传统方式 使用tee的方案
多文件写入 多次重定向 单次tee多文件
多进程处理 临时文件 进程替换
实时监控+保存 分离命令 单管道完成

4. 脚本中的操作审计

在自动化脚本中,我们经常需要记录执行过程,同时保持正常的输出流向。 tee 可以在不干扰原有逻辑的情况下添加审计功能:

#!/bin/bash

# 记录所有输出到日志,同时显示在终端
exec > >(tee -a "${0%.*}.log") 2>&1

echo "脚本开始执行: $(date)"
important_command
echo "脚本执行结束: $(date)"

审计功能增强技巧

  • 使用 -a 参数追加日志,避免运行多次覆盖记录
  • 结合 script 命令记录完整会话(包括输入)
  • 对敏感操作添加时间戳: tee -a >(while read line; do echo "[$(date)] $line"; done > audit.log)

5. 特权模式下的安全记录

使用 sudo 执行命令时,普通重定向会因为权限问题失败。 tee 提供了安全的解决方案:

# 错误方式 - 重定向整个sudo命令
sudo echo "test" > /root/test.txt  # 失败,因为>由shell执行

# 正确方式 - 让tee处理文件写入
echo "test" | sudo tee /root/test.txt >/dev/null

安全最佳实践

  1. 通过管道将非特权命令的输出传给 sudo tee
  2. 添加 >/dev/null 避免屏幕显示敏感信息
  3. 对于追加模式使用 sudo tee -a
  4. 限制日志文件的权限: sudo tee /var/log/secure.log && sudo chmod 600 /var/log/secure.log
# 完整示例:安全记录服务状态
systemctl status nginx | sudo tee /var/log/nginx-status.log >/dev/null
sudo chmod 600 /var/log/nginx-status.log

掌握了这五个场景,你会发现 tee 远不止是 > 的替代品。它填补了Linux管道系统中的关键缺口,在需要数据分流的场景中展现出惊人的灵活性。下次当你面临"既要...又要..."的命令行需求时,不妨先想想 tee 能否优雅解决。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐