一、tee 命令概述
tee是 Linux/Unix 系统中数据流分流的核心命令,名称源自 T 型三通管道,形象描述其功能:从标准输入读取数据,同时输出到屏幕(标准输出)和一个 / 多个文件。
它完美解决 “既要实时看输出、又要留存日志” 的需求,是运维调试、脚本日志、权限写入的必备工具,区别于普通重定向>/>>,保留终端显示是其核心优势。
二、基本语法
执行命令:man tee查看官方手册
命令 | tee [选项] 文件名1 文件名2 ...
- 从管道 / 标准输入读取数据
- 同时输出到:终端屏幕 + 指定文件
- 支持多文件输出,空格分隔即可
三、命令选项及作用
| 选项 | 长选项 | 作用说明 |
|---|---|---|
-a | --append | 追加写入文件,不覆盖原有内容 |
-i | --ignore-interrupts | 忽略中断信号(如Ctrl+C),保证写入完整 |
-p | --output-error | 对非管道写入错误做诊断提示 |
-u | - | 无缓冲写入,实时输出 |
--help | - | 显示帮助信息并退出 |
--version | - | 输出版本信息并退出 |
四、常用命令示例
1. 基础用法:屏幕显示 + 覆盖写入文件
ls -l | tee file_list.txt
- 终端实时显示目录列表
- 同时覆盖写入
file_list.txt,文件已存在则清空重写
2. 追加模式:不覆盖,尾部添加内容
echo "新增日志内容" | tee -a run.log
- 保留文件原有数据,新内容追加到末尾
- 适合持续记录脚本 / 命令运行日志
3. 同时写入多个文件
dmesg | tee kernel.log /tmp/dmesg.bak
- 一份输入,同时输出到多个文件,高效备份
4. 忽略中断信号(长时间任务必备)
ping www.baidu.com | tee -i ping.log
- 按
Ctrl+C中断时,仍保证已输出内容完整写入文件
5. 无缓冲实时写入(监控场景)
tail -f access.log | tee -u realtime_backup.log
- 禁止数据缓冲,日志实时同步到备份文件
6. 配合 sudo 写入权限文件(经典场景)
普通重定向>无权限,tee可绕过:
echo "export PATH=\$PATH:/usr/local/bin" | sudo tee -a /etc/profile
- 直接修改系统配置文件,无需切换 root 用户
7. 只写入文件,不显示屏幕
ps aux | tee process.txt > /dev/null
- 输出重定向到黑洞,仅留存文件,不占用终端
8. 捕获标准错误(完整日志)
make 2>&1 | tee build.log
2>&1将错误输出合并到标准输出,完整留存编译日志
五、高级应用:脚本全程日志记录
#!/bin/bash # 脚本功能:备份数据并留存完整日志 exec 2>&1 # 合并标准错误 exec > >(tee backup_$(date +%Y%m%d).log) # 全程分流输出 echo "【$(date)】开始备份任务..." tar -czf /backup/data.tar.gz /data/ echo "【$(date)】备份完成,文件大小:$(du -h /backup/data.tar.gz | awk '{print $1}')"- 脚本所有输出实时显示 + 自动归档,便于事后排查问题
六、退出状态说明
0:所有输出目标写入成功>0:至少一个文件写入失败(其他成功文件仍保留)
七、核心总结
- 核心作用:一进多出,屏幕 + 文件同时输出
- 默认行为:覆盖写入,需追加用
-a - 高频组合:
sudo tee解决权限问题,2>&1捕获完整日志 - 适用场景:运维调试、脚本日志、实时监控、权限写入