Shell脚本-tee工具

一、前言

在 Linux/Unix 系统中,tee 是一个非常实用的命令行工具,它可以帮助我们 同时将命令的输出打印到终端,并写入文件。这种"双路输出"机制在脚本调试、日志记录、自动化任务中非常有用。

无论是做日志分析、脚本调试,还是编写部署脚本,tee 都是一个不可或缺的工具。

本文将带你全面了解 tee 工具的使用方式,包括:

tee 的基本语法与常用参数

✅ 如何将命令输出既显示又保存

tee 在 Shell 脚本中的实战应用

✅ 与其他文本处理命令的联合使用

✅ 实际开发中的常见问题与优化建议

并通过完整的代码示例帮助你快速上手并熟练掌握 tee 的各种高级用法。

二、什么是 tee?

tee 是一个用于 复制输入流到多个输出 的命令行工具。它可以将标准输入的内容输出到标准输出(通常是终端),同时写入一个或多个文件。

✅ 典型用途包括:

场景 示例
日志记录 将脚本执行过程保存到日志文件
调试输出 查看命令结果的同时保存到文件
自动化部署 输出安装进度并记录到日志
权限操作 使用 sudo + tee 写入受保护文件

三、tee 基础语法

bash 复制代码
command | tee [选项] 文件名

✅ 常用选项说明:

参数 描述
-a--append 追加写入文件,而不是覆盖
-i--ignore-interrupts 忽略中断信号(如 Ctrl+C)
-p 如果管道写入失败,不退出程序(默认会退出)
--help 显示帮助信息
--version 显示版本信息

四、tee 使用示例

✅ 示例1:基础使用 ------ 同时输出到终端和文件

bash 复制代码
echo "Hello, World!" | tee output.txt

终端输出:

复制代码
Hello, World!

同时 output.txt 文件中也写入了该内容。

✅ 示例2:追加写入(-a

bash 复制代码
echo "Line 1" > output.txt
echo "Line 2" | tee -a output.txt

此时 output.txt 内容为:

复制代码
Line 1
Line 2

✅ 示例3:同时写入多个文件

bash 复制代码
echo "Data to log" | tee file1.log file2.log

file1.logfile2.log 都会被写入 "Data to log"

✅ 示例4:忽略中断信号(-i

bash 复制代码
ping www.baidu.com | tee -i ping.log

即使按下 Ctrl+C,tee 也不会立即终止,而是继续写入最后一段数据。

五、tee 在 Shell 脚本中的应用

✅ 示例1:记录脚本运行日志

bash 复制代码
#!/bin/bash
exec > >(tee -a script.log) 2>&1
echo "脚本开始执行..."
sleep 2
echo "正在处理任务..."
echo "脚本执行完成。"

此脚本的所有输出都会显示在终端,并写入 script.log 文件。

✅ 示例2:权限提升后写入文件(结合 sudo

bash 复制代码
echo "new content" | sudo tee /etc/myconfig.conf

即使 /etc/myconfig.conf 没有写权限,也可以通过 sudo tee 成功写入。

✅ 示例3:调试脚本时查看中间结果

bash 复制代码
ls -la /var/log/ | tee debug_output.txt | grep error

你可以看到中间的 ls 结果,同时也能进行后续 grep 过滤。

六、tee 与其他命令的配合使用

✅ 示例1:结合 grep 过滤并记录日志

bash 复制代码
dmesg | grep "error" | tee error_log.txt

输出所有错误信息到终端,并保存到 error_log.txt

✅ 示例2:结合 awk 提取字段并保存

bash 复制代码
ps aux | awk '{print $1, $2}' | tee process_info.txt

提取进程用户和 PID 并保存。

✅ 示例3:结合 curl 下载并显示进度

bash 复制代码
curl -s https://example.com/data.json | tee data.json | jq .

下载 JSON 文件并实时显示其内容(通过 jq 解析)。

七、tee 使用技巧总结

技巧 说明
✅ 使用 -a 追加写入 避免覆盖已有日志
✅ 多文件写入 可以一次写入多个目标文件
✅ 结合 exec 记录整个脚本输出 适用于调试和审计
✅ 与 sudo 配合写入只读文件 替代 echo > /path/to/file 的权限问题
✅ 忽略中断信号(-i 防止意外中断导致数据丢失
✅ 结合 pipe 管道链式调用 实现复杂数据流处理

八、tee 实战案例汇总

✅ 案例1:记录编译日志

bash 复制代码
make all 2>&1 | tee build.log

编译过程中实时查看输出,并保存完整日志。

✅ 案例2:自动备份配置文件并修改

bash 复制代码
cat /etc/ssh/sshd_config | tee sshd_config.bak | sed 's/PasswordAuthentication no/PasswordAuthentication yes/' | sudo tee /etc/ssh/sshd_config

先备份原配置,再修改并写回。

✅ 案例3:监控网络请求并记录响应

bash 复制代码
curl -s http://api.example.com/status | tee response.log | jq .

查看 API 返回值并保存原始数据。

九、常见问题与解决方法

问题 原因 解决方案
文件未被写入 权限不足 使用 sudo tee
内容被覆盖而非追加 未使用 -a 添加 -a 参数
输出乱码或编码异常 编码不一致 设置 LANG=C 或使用 iconv 转换
tee 退出太快 被中断信号终止 使用 -i 忽略中断
输出顺序混乱 多线程或异步输出 使用 script 或重定向统一处理

十、总结对比表:tee 常用参数一览

参数 功能
-a 追加写入文件
-i 忽略中断信号
-p 出错时不退出
--help 显示帮助信息
--version 显示版本信息

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
狗头大军之江苏分军11 小时前
iPhone 17 vs iPhone 17 Pro:到底差在哪?买前别被忽悠了
前端
小林coding11 小时前
再也不怕面试了!程序员 AI 面试练习神器终于上线了
前端·后端·面试
文心快码BaiduComate11 小时前
WAVE SUMMIT深度学习开发者大会2025举行 文心大模型X1.1发布
前端·后端·程序员
babytiger11 小时前
python 通过selenium调用chrome浏览器
前端·chrome
passer98111 小时前
基于webpack的场景解决
前端·webpack
奶昔不会射手11 小时前
css3之grid布局
前端·css·css3
举个栗子dhy11 小时前
解决在父元素上同时使用 onMouseEnter和 onMouseLeave时导致下拉菜单无法正常展开或者提前收起问题
前端·javascript·react.js
Coding_Doggy12 小时前
苍穹外卖前端Day1 | vue基础、Axios、路由vue-router、状态管理vuex、TypeScript
前端
前端与小赵12 小时前
vue3和vue2生命周期的区别
前端·javascript·vue.js