tee 是一个非常实用的 Linux 命令,它的核心作用就像是一个 T 型三通管,可以把数据流同时分流到文件和屏幕上。
一、基本原理:为何叫 T 型管?
tee 的名字来源于管道行业中的 T 型三通接头。数据从一端流入,从另外两端原样流出。
在 Linux 中,这表现为:
从标准输入(stdin)读取数据,然后同时写入到标准输出(stdout,通常是屏幕)和指定的一个或多个文件。
它的基本语法是:
command | tee [选项] 文件1 [文件2...]
二、核心用途与场景
1. 最经典的场景:记录日志并实时查看
运行一个长时间脚本时,你既想在屏幕上看到实时输出,又想将输出保存到日志文件中以供事后排查。
./install_script.sh | tee install.log
这样,输出既会显示在终端,又会完整地保存到 install.log 里。
2. 追加写入,而非覆盖
默认情况下,tee 会覆盖文件内容。如果只想追加到文件末尾,使用 -a (append) 选项。
ls -l | tee -a file_list.txt
3. 解决权限问题的利器
这是 tee 一个非常巧妙的用法。当你使用 sudo echo "内容" > /etc/profile 时,会提示权限不足,因为重定向符号 > 是由当前的 shell 执行的,而非 sudo,sudo 只会提升 echo 的权限,而 >> 或 > 依然以普通用户的权限去写入 /etc/profile,最终会提示“权限不够 (Permission denied)”。
利用 tee 就能完美解决:
echo "new config line" | sudo tee /etc/some_config.conf > /dev/null
# 如果不想看到屏幕输出,可以重定向到 /dev/null
4. 分发数据到多个文件
可以将一份数据同时写入多个文件,这在需要备份或处理相同数据时很高效。
echo "important data" | tee file1.txt file2.txt backup/file3.txt
5. 在管道中间调试
在一个非常长的命令管道中,你可以插入 tee 来截获中间数据,查看管道这一步的输出是否符合预期,而不中断整个流程。
cat access.log | grep "ERROR" | tee /tmp/error_grep.log | cut -d' ' -f1 | sort | uniq -c
这行命令在 grep 之后,将结果一边保存到临时文件 /tmp/error_grep.log 供你检查,一边继续传递给后面的 cut 命令。
6. 写入 /dev/null 来模拟纯传递
如果你只想把输出写入文件,完全不想在屏幕上显示,可以把标准输出重定向到 /dev/null。这等价于普通的 > 重定向,但结合 sudo 或其它场景时会用到。
echo "secret" | tee private.key > /dev/null
三、高级用法:活用文件描述符
tee 不仅能处理标准输出,还能借助进程替换 >(...) 把数据喂给其他命令。
例如,你想一边看原始输出,一边实时统计行数并压缩存档:
# 将 data 命令的输出,一边在屏幕显示,一边传给 wc -l 统计行数,一边压缩保存
data_command | tee >(wc -l > count.txt) | gzip > data.gz
再比如,同时保存原始日志和过滤后的错误日志:
cat program.log | tee raw_output.log | grep "ERROR" > errors.log
# 但请注意,这里管道后面的 grep 收到的数据依然是 tee 转发给标准输出的完整数据。
# 更精确的用法是用进程替换:
cat program.log | tee raw_output.log >(grep "ERROR" > errors.log) > /dev/null
四、常用选项总结
-a, --append:追加到文件,而不是覆盖。
-i, --ignore-interrupts:忽略中断信号(Ctrl+C),这在脚本中想让 tee 优雅退出时有用。
-p:诊断写入到管道时的错误,非标准输出。
--output-error[=模式]:当写入到任何输出发生错误时的行为,模式可以是 warn, warn-nopipe, exit, exit-nopipe,用于更精细地控制错误处理。
五、与其他命令的对比
- 重定向
>:只能将输出写入文件,屏幕上无显示。
tee:写入文件的同时输出到屏幕(或传递给下一个命令),这是它不可替代的核心价值。
script 命令:可以记录整个终端会话的全部输入和输出,功能更重,适合“录屏”,而 tee 更轻量,适合处理单个命令流。
总而言之,tee 是一个在命令行中构建数据流处理管线时不可或缺的“分流器”,掌握它能让你更灵活地监控、记录和调试命令。