tee 命令的基本工作原理

tee 命令是从管道读取输入,但它有两个默认输出:

  1. 标准输出(stdout) - 默认显示到终端

  2. 文件输出 - 保存到指定文件

命令输出 | tee filename

数据流向:

command → [管道] → tee → 终端屏幕
                 ↓
                文件

实际示例

# 示例1:同时显示在屏幕和保存到文件
ls -l | tee file_list.txt

tee 的多个输出目标

实际上,tee 可以有多于两个输出:

# 输出到多个文件
command | tee file1 file2 file3

# 输出到文件和另一个命令
command | tee file.txt | grep "pattern"

为什么说 tee 默认输出到终端?

因为 tee 的标准输出默认连接到终端,就像其他命令一样:

# 这三条命令是等价的:
ls | tee file.txt 
ls | tee file.txt > /dev/tty
ls | tee file.txt 1>/dev/tty

注:> /dev/tty 表示:将输出重定向到当前正在使用的这个终端窗口,不受其他重定向影响。

对比普通重定向

# 普通重定向:输出只到文件,不在屏幕显示
ls > file.txt

# 使用 tee:输出同时到屏幕和文件
ls | tee file.txt

# 使用 tee 但不想显示在屏幕
ls | tee file.txt > /dev/null

处理错误消息的重要细节

关键点: tee 只处理标准输出,不处理标准错误:

# 错误示例:这样不能丢弃原命令的错误
find /etc -name "*.conf" | tee output.txt 2>/dev/null
# 错误:find 命令的错误仍然会显示,因为 2>/dev/null 只作用于 tee 命令

# 正确做法:先重定向错误,再管道给 tee
find /etc -name "*.conf" 2>/dev/null | tee output.txt

总结

  • tee 默认有两个输出:终端屏幕 + 指定文件

  • 这是 tee 命令的设计特性,不是特殊的管道魔法

  • tee 只处理标准输出流,错误流需要单独处理

  • 可以认为 tee 是"T型分流器",一份输入,多份输出

更多推荐