别再只用 了Linux tee命令的5个实用场景从日志记录到管道调试在Linux命令行中重定向操作符和几乎是每个用户最早掌握的技能之一。但当你需要同时查看命令输出并保存到文件时这两个简单的符号就显得力不从心了。这就是tee命令大显身手的地方——它像水管工用的三通接头将数据流同时导向屏幕和文件。对于已经熟悉基础重定向的中级用户来说tee的价值远不止于显示并保存这么简单。本文将带你探索五个真实场景从日志记录到管道调试让这个看似简单的工具成为你命令行工具箱中的瑞士军刀。1. 实时监控并保存长命令输出编译大型项目、处理海量数据或执行长时间运行的脚本时我们既需要实时查看进度又希望保留完整的日志供后续分析。传统做法是先重定向到文件再用tail -f查看但这需要两个终端窗口。# 传统方式需要两个终端 make build.log # 后台运行 tail -f build.log # 另一个终端查看tee让这一切变得简单make 21 | tee build.log关键点解析21将标准错误(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调试技巧在每个管道阶段后插入tee debugX.txt检查各阶段的输出文件是否符合预期确认问题后移除多余的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) 21 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安全最佳实践通过管道将非特权命令的输出传给sudo tee添加/dev/null避免屏幕显示敏感信息对于追加模式使用sudo tee -a限制日志文件的权限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能否优雅解决。