tee介绍
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 即可。
留下评论