在 Linux/Unix 系统中,tee
是一个非常实用的命令行工具,它可以帮助我们 同时将命令的输出打印到终端,并写入文件。这种“双路输出”机制在脚本调试、日志记录、自动化任务中非常有用。
无论是做日志分析、脚本调试,还是编写部署脚本,tee
都是一个不可或缺的工具。
本文将带你全面了解 tee
工具的使用方式,包括:
✅ tee
的基本语法与常用参数
✅ 如何将命令输出既显示又保存
✅ tee
在 Shell 脚本中的实战应用
✅ 与其他文本处理命令的联合使用
✅ 实际开发中的常见问题与优化建议
并通过完整的代码示例帮助你快速上手并熟练掌握 tee
的各种高级用法。
tee
是一个用于 复制输入流到多个输出 的命令行工具。它可以将标准输入的内容输出到标准输出(通常是终端),同时写入一个或多个文件。
场景 | 示例 |
---|---|
日志记录 | 将脚本执行过程保存到日志文件 |
调试输出 | 查看命令结果的同时保存到文件 |
自动化部署 | 输出安装进度并记录到日志 |
权限操作 | 使用 sudo + tee 写入受保护文件 |
command | tee [选项] 文件名
参数 | 描述 |
---|---|
-a 或 --append |
追加写入文件,而不是覆盖 |
-i 或 --ignore-interrupts |
忽略中断信号(如 Ctrl+C) |
-p |
如果管道写入失败,不退出程序(默认会退出) |
--help |
显示帮助信息 |
--version |
显示版本信息 |
echo "Hello, World!" | tee output.txt
终端输出:
Hello, World!
同时 output.txt
文件中也写入了该内容。
-a
)echo "Line 1" > output.txt
echo "Line 2" | tee -a output.txt
此时 output.txt
内容为:
Line 1
Line 2
echo "Data to log" | tee file1.log file2.log
file1.log
和 file2.log
都会被写入 "Data to log"
。
-i
)ping www.baidu.com | tee -i ping.log
即使按下 Ctrl+C,tee
也不会立即终止,而是继续写入最后一段数据。
#!/bin/bash
exec > >(tee -a script.log) 2>&1
echo "脚本开始执行..."
sleep 2
echo "正在处理任务..."
echo "脚本执行完成。"
此脚本的所有输出都会显示在终端,并写入
script.log
文件。
sudo
)echo "new content" | sudo tee /etc/myconfig.conf
即使
/etc/myconfig.conf
没有写权限,也可以通过sudo tee
成功写入。
ls -la /var/log/ | tee debug_output.txt | grep error
你可以看到中间的 ls
结果,同时也能进行后续 grep
过滤。
grep
过滤并记录日志dmesg | grep "error" | tee error_log.txt
输出所有错误信息到终端,并保存到 error_log.txt
。
awk
提取字段并保存ps aux | awk '{print $1, $2}' | tee process_info.txt
提取进程用户和 PID 并保存。
curl
下载并显示进度curl -s https://example.com/data.json | tee data.json | jq .
下载 JSON 文件并实时显示其内容(通过 jq
解析)。
技巧 | 说明 |
---|---|
✅ 使用 -a 追加写入 |
避免覆盖已有日志 |
✅ 多文件写入 | 可以一次写入多个目标文件 |
✅ 结合 exec 记录整个脚本输出 |
适用于调试和审计 |
✅ 与 sudo 配合写入只读文件 |
替代 echo > /path/to/file 的权限问题 |
✅ 忽略中断信号(-i ) |
防止意外中断导致数据丢失 |
✅ 结合 pipe 管道链式调用 |
实现复杂数据流处理 |
make all 2>&1 | tee build.log
编译过程中实时查看输出,并保存完整日志。
cat /etc/ssh/sshd_config | tee sshd_config.bak | sed 's/PasswordAuthentication no/PasswordAuthentication yes/' | sudo tee /etc/ssh/sshd_config
先备份原配置,再修改并写回。
curl -s http://api.example.com/status | tee response.log | jq .
查看 API 返回值并保存原始数据。
问题 | 原因 | 解决方案 |
---|---|---|
文件未被写入 | 权限不足 | 使用 sudo tee |
内容被覆盖而非追加 | 未使用 -a |
添加 -a 参数 |
输出乱码或编码异常 | 编码不一致 | 设置 LANG=C 或使用 iconv 转换 |
tee 退出太快 |
被中断信号终止 | 使用 -i 忽略中断 |
输出顺序混乱 | 多线程或异步输出 | 使用 script 或重定向统一处理 |
参数 | 功能 |
---|---|
-a |
追加写入文件 |
-i |
忽略中断信号 |
-p |
出错时不退出 |
--help |
显示帮助信息 |
--version |
显示版本信息 |
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!