当前位置: 首页 > backend >正文

Shell脚本-tee工具

一、前言

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

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

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

tee 的基本语法与常用参数
✅ 如何将命令输出既显示又保存
tee 在 Shell 脚本中的实战应用
✅ 与其他文本处理命令的联合使用
✅ 实际开发中的常见问题与优化建议

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

二、什么是 tee?

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

✅ 典型用途包括:

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

三、tee 基础语法

command | tee [选项] 文件名

✅ 常用选项说明:

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

四、tee 使用示例

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

echo "Hello, World!" | tee output.txt

终端输出:

Hello, World!

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

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

echo "Line 1" > output.txt
echo "Line 2" | tee -a output.txt

此时 output.txt 内容为:

Line 1
Line 2

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

echo "Data to log" | tee file1.log file2.log

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

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

ping www.baidu.com | tee -i ping.log

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

五、tee 在 Shell 脚本中的应用

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

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

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

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

echo "new content" | sudo tee /etc/myconfig.conf

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

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

ls -la /var/log/ | tee debug_output.txt | grep error

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

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

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

dmesg | grep "error" | tee error_log.txt

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

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

ps aux | awk '{print $1, $2}' | tee process_info.txt

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

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

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:记录编译日志

make all 2>&1 | tee build.log

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

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

cat /etc/ssh/sshd_config | tee sshd_config.bak | sed 's/PasswordAuthentication no/PasswordAuthentication yes/' | sudo tee /etc/ssh/sshd_config

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

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

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显示版本信息

十一、结语

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

http://www.xdnf.cn/news/15823.html

相关文章:

  • 小程序和H5数据mock配置过程
  • 前端环境搭建---基于SpringBoot+MySQL+Vue+ElementUI+Mybatis前后端分离面向小白管理系统搭建
  • LLM 的Top-P参数 是在LLM中的每一层发挥作用,还是最后一层?
  • SpringBoot五分钟快速入门指南
  • NW993NX584美光固态闪存NX559NX561
  • [故障诊断方向]基于二维时频图像和数据增强技术的轴承故障诊断模型
  • 数据分析综合应用 30分钟精通计划
  • 动态规划——数位DP经典题目
  • 量子计算与AI融合的技术突破与实践路径
  • 6. 装饰器模式
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘pillow’问题
  • 小架构step系列19:请求和响应
  • Java行为型模式---中介者模式
  • [故障诊断方向]SNNs:针对小样本轴承故障诊断的孪生神经网络模型
  • Selenium 中 findElement 方法全解析:定位网页元素的 7 种方式
  • BeanFactory 和 FactoryBean 的区别
  • Java行为型模式---访问者模式
  • 用Dynamic chunk去干掉tokenizer?
  • 从零入门:云迁移原理详解与华为Rainbow实战指南
  • 数据结构 队列
  • 信息系统风险的安全技术防范思路
  • 教育科技内容平台的破局之路:从组织困境到 UGC 生态的构建
  • CCF编程能力等级认证GESP—C++7级—20250628
  • [FFmpeg] AVFormatContext、AVInputFormat、AVOutputFormat | libavformat
  • 为任意Java程序配置Socks5与HTTP代理的方法
  • 2025年水安备考:水利水电安全员C类考试题
  • 基于Scrapy-Redis的分布式爬虫系统:工业级实现与深度优化
  • nodejs值process.kill
  • CCF编程能力等级认证GESP—C++8级—20250628
  • 信息学奥赛一本通 1579:【例 5】皇宫看守 | 洛谷 P2458 [SDOI2006] 保安站岗