少于 1 分钟阅读 次阅读

tee 是 Linux/Unix 系统中一个非常实用且经典的命令行工具。它的名字生动地来源于水管工程中的“T型三通”接头(T-splitter)。

它的核心作用非常简单但强大:读取标准输入(stdin)的数据,并将其同时输出到标准输出(stdout,通常是屏幕)以及一个或多个文件中。 就像一个三通水管,把一股水流分成了两股。

基本语法

tee [选项]... [文件]...

常见使用场景与示例

1. 基础用法:边看边存

当你执行一个耗时较长的命令,既想在屏幕上实时看到输出进度,又想把输出结果保存到日志文件中供以后分析时,tee 是最佳选择。

ping google.com | tee ping_log.txt

  • 效果: 屏幕上会不断打印 ping 的结果,同时这些内容也被一字不差地覆盖写入到了 ping_log.txt 中。

2. 追加写入(不覆盖原有内容)

默认情况下,tee 会清空目标文件的原有内容并重新写入。如果你想将新内容追加到文件末尾,需要使用 -a (或 --append) 选项。

echo "这是新增加的一行" | tee -a ping_log.txt

3. 配合 sudo 解决提权写入问题

这是 tee 命令在日常运维中最重要、最常见的用途。

如果你尝试用普通用户将内容重定向到需要 root 权限的文件,会失败:

# 错误示范:会提示权限不够 (Permission denied)
sudo echo "wifi.powersave = 2" > /etc/NetworkManager/conf.d/default.conf

为什么会报错? 因为 sudo 只赋予了 echo 命令 root 权限,而重定向符号 > 是由你当前的普通用户 Shell 执行的,普通用户没有权限写 /etc/ 下的文件。

正确做法(使用 tee):

# 正确示范:成功写入
echo "wifi.powersave = 2" | sudo tee /etc/NetworkManager/conf.d/default.conf

  • 原理解释: echo 以普通用户身份输出文本,通过管道 | 传给后面的命令。后面的 sudo tee 是以 root 身份运行的,因此它有绝对的权限将接收到的文本写入到受保护的配置文件中。

4. 同时写入多个文件

你可以指定多个文件,tee 会像克隆一样把数据同时写入它们。

echo "Hello World" | tee file1.txt file2.txt file3.txt

5. 忽略中断信号

使用 -i (或 --ignore-interrupts) 选项,可以让 tee 忽略终端的中断信号(比如你按了 Ctrl+C)。这在处理重要且不能被打断的后台日志记录时很有用。

make | tee -i build_log.txt

6. 只要写文件,不在屏幕上显示

有时候你只需要用到 tee 的提权写文件功能(场景3),但不想让内容在屏幕上再打印一遍扰乱视线,可以将其标准输出重定向到“黑洞”(/dev/null)。

echo "Secret Config" | sudo tee /etc/secret.conf > /dev/null

总结

简单来说,只要你遇到“既想在终端看结果,又想存文件”,或者“需要用 sudo 权限向文件中 echo 内容”的情况,直接掏出 tee 即可。

留下评论