一、前言

在 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.pswp.cn/news/915342.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915342.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915342.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

走进Linux的世界:Linux基本指令(三)

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

跨域详解与解决方案:从理论到实践的全面指南

目录 1. 跨域是什么?为什么它让人头秃? 为什么跨域问题让人抓狂? 跨域的本质 2. 跨域的罪魁祸首:同源策略与CORS 同源策略的来龙去脉 CORS:跨域的“通行证” 3. JSONP:古老但依然有用的跨域“黑科技” JSONP的原理 JSONP的优缺点 4. 代理服务器:跨域的“中间人…

深入详解:决策树在辅助诊断系统与临床决策支持中的应用及实现细节

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

【详细笔记】两类曲线积分转换

文章目录参考教程一两类曲线积分的联系参数方程曲线的切线方向余弦参考教程2两类曲线积分之间的关系物理意义解释证明思路参考教程一 3分钟帮你搞定两类曲线积分之间的联系(弧长和坐标) 两类曲线积分的联系 设平面曲线LLL上的第二类曲线积分∫LPdxQdy…

【成品设计】基于STM32F429的云端电子相册

V1《基于STM32F429的云端电子相册》 V1硬件框图:V1功能说明: 支持 softAP 配网。支持 HTTPS 客户端的 GET\POST 请求支持文件系统用于图片的存储。支持 LVGL 自定义 GUI。日历功能。STM32F429文件系统LVGLRGB LCD屏幕。屏幕尺寸480*480. 首次开机交互&am…

网络安全隔离技术解析:从网闸到光闸的进化之路

目录 一、网络安全隔离技术体系 1.1 网络安全隔离技术发展历程 1.2 隔离技术分类矩阵 1.3 核心隔离原理对比 二、网闸技术深度解析 2.1 GAP架构剖析(Guarded Access Point System 安全隔离与信息交换系统) 2.2 技术演进路线 三、光闸技术突破创新…

初识 二叉树

目录树什么是二叉树二叉树的五种状态满二叉树完全二叉树二叉排序树平衡二叉树二叉树的遍历B3642 二叉树的遍历P1305 新二叉树二叉树的深度P4913 【深基16.例3】二叉树深度相关例题训练:二叉树问题树 这是树(拍摄于郑州轻工业大学,第一次郑州轻…

(1)Windows环境下安装Oracle

概述:Oracle数据库是一种网络上的数据库, 它在网络上支持多用户, 支持服务器/客户机等部署(或配置)。服务器与客户机是软件概念:它们与计算机硬件不存在一一对应的关系. 即:同一台计算机既可以充当服务器又可以充当客户机,或者一台计算机只充当服务器或只…

工业数据集成中间件工具OPC Router详细介绍

一、产品概述 OPC Router 是 Software Toolbox 旗下的一款面向工业数据集成与自动化的数据中间件工具,专注于实现各类工业系统之间的数据交互和自动化流程编排。它通过模块化的插件机制,打通 PLC、ERP、MES、数据库、MQTT、REST API 等不同系统之间的数…

消息队列 2.RabbitMQ的基本概念与使用

RabbitMQ 是一款基于 AMQP(Advanced Message Queuing Protocol)协议的开源消息中间件,主要用于实现分布式系统中的消息传递,支持异步通信、系统解耦、流量削峰等场景。在 Java 生态中,RabbitMQ 被广泛应用,…

【web安全】SQL注入与认证绕过

目录 一、SQL注入漏洞 1.1 基础注入原理 1.2 实用注入Payload分类 逻辑绕过型 注释截断型 联合查询型 常见的万能密码-CSDN博客 二、登录绕过实战技巧 2.1 基础绕过手法 2.2 高级绕过技巧 编码绕过 多重注释 参数污染 三、密码重置漏洞利用 3.1 常见漏洞模式 3…

Python适配器模式详解:让不兼容的接口协同工作

一、模式定义与核心思想 适配器模式(Adapter Pattern) 是一种结构型设计模式,它通过创建一个中间层(适配器),将不兼容的接口转换为客户端期望的接口。就像现实中的电源适配器,让不同国家的插头…

微信小程序列表数据上拉加载,下拉刷新

1.上拉加载数据,数据 下一页数据 前面的数据([...this.data.list, ...data.records)2.当用户上拉加载过快时,会不停的调用接口,需要节流阀isLoading3.上拉加载到最后一页的判断,isFinish// pages/list.js…

【树上倍增 LCA DFS 前缀和】P10391 [蓝桥杯 2024 省 A] 零食采购|普及+

本文涉及知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 CDFS 树上倍增 LCA P10391 [蓝桥杯 2024 省 A] 零食采购 题目描述 小蓝准备去星际旅行,出发前想在本星系采购一些零食,星系内有 nnn 颗星球&#x…

PDF发票批量打印工具哪个好?高效打印发票的实用工具推荐

开小超市这几年,每月要打几十张进货发票做账,以前打印时总犯愁:有的发票 PDF 太大,打出来字小得看不清;有的又太窄,白白浪费半张纸。试过手动调整,每张都要改缩放比例,累不说&#x…

4G模块 A7680通过MQTT协议连接到华为云

命令说明 基础AT指令 ATi显示产品的标志信息 ATCIMI查询IMSI ATCICCID从SIM卡读取ICCID ATCGSN查询产品序列号 ATCPIN查询卡状态 ATCSQ查询信号强度 ATCGATT查询当前PS域状态 ATCREG查询GPRS注册状态 ATCEREG查询4G注册状态 ATCGPADDR查询PDP地址 ATCMGF选择短信格式 ATCMGS发…

大模型词表设计与作用解析

几乎所有大型语言模型(LLM)都有自己独立的词表(Vocabulary)。这是模型设计和训练过程中的核心组件之一。以下是关于词表的关键点: 1. 词表的作用 分词基础:词表定义了模型如何将输入文本拆分成基本单元&…

(一)Eshop(异常处理中间件/grpc)

文章目录项目地址一、异常处理1.1 自定异常1.2 自定义异常处理中间件1.3 注册中间件二、grpc服务2.1 创建protos1. 打折的protos2. 设置grpc server3. program配置服务4. docker-compose2.2 CRUD1. 查询2.3 测试1. 发起查询请求三、grpc服务消费3.1 创建client1. 添加服务2. 选…

BLIP、InternVL Series(下)

目录 一、InternVL1.5 1、改进 二、InternVL2 1、渐进式扩展 2、多模态扩展 三、InternVL2.5 1、方法 2、数据优化 四、InternVL3 2、方法 3、训练后处理 4、测试时扩展 五、BLIP-3o 一、InternVL1.5 1、改进 InternVL1.5在InternVL基础上,优化了QLLa…

【数据结构】二维差分数组

题目链接 【模板】二维差分_牛客题霸_牛客网 牛客网 - 找工作神器|笔试题库|面试经验|实习招聘内推,求职就业一站解决_牛客网 描述 给定一个 nmnm 的整数矩阵 bb,矩阵的下标从 11 开始记作 bi,jbi,j​。现在需要支持 qq 次操作,第 tt 次…