Linux `tee` 命令详解
🐧 Linux tee
命令详解
学习目标
- 理解
tee
命令的基本功能与工作原理 - 掌握
tee
在命令管道中的作用,以及如何将输出同时显示到屏幕和文件中 - 能够结合脚本、日志记录、调试等实际场景灵活使用
tee
核心重点(Key Points)
主题 | 内容 |
---|---|
命令名称 | tee |
功能 | 将输入内容“复制”到标准输出和一个或多个文件中 |
底层机制 | 从 stdin 读取数据,写入 stdout 和指定的文件 |
常见用途 | 日志记录、调试脚本、命令行中间结果保存 |
支持平台 | 所有主流 Linux 发行版(Ubuntu/CentOS/EulerOS/Debian) |
典型命令 | `command |
详细讲解
🔍 一、什么是 tee
命令?
tee
是一个非常实用的 Linux 命令行工具,它的名字来源于“T 形接头”——就像水管中的 T 型接口一样,它能将输入流“分叉”成两路:
- 一路继续流向标准输出(通常是终端)
- 另一路写入指定的一个或多个文件中
⚠️ 它非常适合在执行命令时同时查看输出并保存日志!
🛠 二、安装与查看版本
大多数 Linux 系统默认已安装 tee
,因为它属于 coreutils
工具包。
Ubuntu / Debian
sudo apt update
sudo apt install coreutils
CentOS / RHEL
sudo yum install coreutils
EulerOS / openEuler
sudo dnf install coreutils
查看版本:
tee --version
# 输出示例:tee (GNU coreutils) 8.34
📚 三、基本语法与常见参数
tee [OPTIONS]... [FILE]...
参数 | 含义说明 |
---|---|
-a |
追加模式(append),不覆盖原有内容 |
-i |
忽略中断信号(SIGINT),防止 Ctrl+C 中断写入 |
-p |
如果管道错误,不退出程序(需支持此特性) |
🎯 四、实战场景与案例解析
✅ 场景1:将命令输出同时打印到屏幕和文件(基础用法)
ls -l | tee output.txt
输出会同时出现在终端屏幕上,并被写入 output.txt
文件中。
✅ 场景2:追加写入而不是覆盖(使用 -a
)
date | tee -a log.txt
每次运行该命令,当前时间都会追加到 log.txt
文件末尾。
✅ 场景3:多文件写入(一次写入多个文件)
echo "Backup completed" | tee status.log history.log
📁 同一条信息会被写入
status.log
和history.log
两个文件中。
✅ 场景4:结合 sudo
写入受保护文件(技巧)
有时你想将输出写入 /etc
下的文件,但普通用户权限不足:
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf > /dev/null
👮 使用
sudo tee
替代直接重定向可以避免权限问题。
✅ 场景5:在脚本中记录日志(自动化运维常用)
#!/bin/bash
exec > >(tee -a script.log) 2>&1
echo "Script started at $(date)"
📝 此方式可让整个脚本的输出都被记录进日志文件,方便后续排查问题。
✅ 场景6:配合 grep
过滤并保存日志
tail -f /var/log/syslog | grep "ERROR" | tee error_log.txt
🧹 实时监控系统日志中的错误信息,并保存下来供分析。
🧪 五、不同发行版之间的差异与注意事项
发行版 | 特点 |
---|---|
Ubuntu | 默认使用 GNU coreutils,支持完整 tee 功能 |
CentOS 7/8 | 默认安装,但某些高级参数(如 -p )可能未启用 |
EulerOS/openEuler | 企业级系统,集成稳定版本,适合服务器环境 |
注意 | 若你使用的是 macOS 或 BSD 系统,tee 的部分选项行为可能略有不同 |
🧰 六、进阶技巧与工具配合使用
🔗 配合 pv
显示进度条(适用于大文件处理)
cat bigfile.txt | pv | tee copy.txt
📊 显示当前传输速率、完成百分比,提升可视化体验。
📄 配合 logger
记录系统日志
echo "System rebooted" | tee /var/log/reboot.log | logger
📋 同时写入本地文件和系统日志(syslog)。
🔄 配合 awk
或 sed
处理后再保存
ps aux | awk '{print $1, $2}' | tee process_list.txt
🧹 提取出进程的用户名和 PID 并保存。
🧠 七、常见问题解答(FAQ)
问题 | 解答 |
---|---|
tee 是否会影响性能? |
对于小数据量几乎无影响,大量数据建议结合 pv 或异步写入 |
如何让 tee 不覆盖文件? |
使用 -a 参数进行追加写入 |
tee 可以写入压缩文件吗? |
可以通过管道结合 gzip :`command |
tee 是否能写入多个终端? |
可以,只要将多个终端设备路径作为文件名传入即可(如 /dev/pts/0 ) |
📌 八、总结
tee
是一个小巧但极其强大的命令,广泛应用于日志记录、脚本调试、自动化流程监控等多个方面。掌握 tee
的使用,不仅能够帮助你更好地理解 Linux 命令行管道的工作机制,还能显著提升你在实际开发和运维中的效率。
💡 提示:你可以将
tee
加入你的日常开发习惯中,例如:# 查看并保存配置 cat /etc/nginx/nginx.conf | tee nginx_backup.conf
或者设置别名简化操作:
alias log='tee -a ~/logfile.txt'
如有追加问题,请输入:追加问题:xxxx