很多情况下,我们需要保存程序/命令的输出到本地,常用的一种方法是重定向,这也是一种很好的方法。但有个问题,如果你想要做后续操作,比如要统计输出的行数等,重定向就有困难了。

这时候,tee 命令就派上用场啦~

tee 语法格式:

$ tee [OPTIONS] [FILE]

这个命令有 4 个主要选项,配合这些选项可以将结果存储在一个或者多个文件中。4 个选项介绍如下:

Options:

Name Description
-a or –append 用于在现有文件的末尾追加写入数据
-i or –ignore-interrupts 用于忽略中断信号
–help 用于显示此命令的所有可用选项
–version 用于显示命令的当前版本

Files:

即目标文件,可以是一个或者多个文件,用于存储 tee 命令的输出。

1. tee 命令基础用法

在 Linux 中,我们可以使用 ls -la 用来查看当前目录里文件的详细信息,想必大家都用过。现在,我们想要保存 ls -la 命令的输出到文件 output.txt 中,我们可以这样操作:

$ ls -la | tee output.txt
$ cat output.txt

Output:

在这里,第一个命令将 ls -la 的输出显示到终端,并将输出写入到文件 output.txt 。第二个命令显示了 output.txt 文件的具体内容,如下图所示:

2. 将输出追加到现有文件中

如果我们使用带有 -a 选项的 tee 命令的话,那么它会将命令的输出追加写入到现有文件,不会覆盖该文件原有的内容。

例如,我们想将 pwd 命令的输出追加到已有文件 output.txt 的末尾,可以这样运行以下命令:

$ pwd | tee -a output.txt
$ cat output.txt

在这里,第一个命令将 pwd 的输出显示到终端,并在 output.txt 文件的末尾追加 pwd 的输出。第二个命令则用于查看输出文件的内容。如下图所示, output.txt 文件包含前一个示例和当前示例的输出

[图]

3. 输出写入多个文件

tee 命令也可以将各种命令的输出存储到多个文件中。这种情况下,我们需要使用空格隔开这些文件名。比如,我们想将 date 命令的输出存储到两个文件 output1.txt 和 output2.txt 中,我们可以这样执行命令:

$ date | tee output1.txt output2.txt
$ cat output1.txt output2.txt

Output:

在这里,第一个命令显示当前系统日期,并将值存储到两个文件 output1.txt 和 output2.txt 中。第二个命令显示这两个文件的内容,具体结果如下:

4. 忽略中断信号

大家知道,命令/程序在收到中断信号时,将被信号所中断。如果 tee 命令在执行过程中不想被中断,我们可以使用带 -i 选项来忽略命令执行时的中断信号。这种情况下,即使我们按下 CTRL + C ,命令仍会正确执行。例如:

$ wc -l output.txt | tee -i output3.txt
$ cat output.txt
$ cat output3.txt

Output:

在这里,第一个命令是计算 output.txt 文件的总行数,并将输出存储到文件 output3.txt 中。第二个命令显示了 output.txt 文件的具体内容,而第三个命令显示 output3.txt 的内容,它与 wc -l output.txt 的输出相同。

5. 将 tee 命令输出通过管道传递给另一个命令

我们可以使用管道将 tee 命令的输出传递给另一个命令。在本例子中,ls 命令将输出传递给 tee 命令,tee 命令的输出传递给 wc 命令,如下所示:

$ ls | tee output4.txt | wc -lcw
$ ls
$ cat output4.txt

Output:

在这里,第一个命令用于将 ls 命令的输出写入文件 output4.txt ,并计算 output4.txt 的行数、字数和字符数。第二个命令用于显示 ls 命令的输出,第三个命令用于查看 output4.txt 文件的内容。

6. 使用 bash 脚本执行 tee 命令

除了 Linux 命令,tee 命令也可将 bash 脚本输出写入到文件中。比如,我们使用以下代码创建名为 add.sh 的 bash 脚本,该脚本将从命令行参数中获取两个输入数字,并打印这两个数字的和。

add.sh

#!/bin/bash
a = $1
b = $2
((result= $a + $b))
echo "The addition of $a+$b=$result"

如果我们想使用 tee 命令将 add.sh 脚本的输出写入到文件 result.txt 中,我们可以这样操作:

$ bash add.sh 50 90 | tee result.txt
$ cat result.txt

Output:

在这个例子里,数字 50 和 90 作为命令行参数传递给脚本 add.sh,然后它的输出通过 tee 命令写入到文件 result.txt 中。之后我们再用 cat 命令来查看 result.txt 文件的内容:

7. 隐藏 tee 输出

如果我们想要将目标命令的输出直接写入文件而不在终端中显示,那我们可以将 tee 命令结果重定向到 /dev/null 中,比如:

$ df | tee output5.txt > /dev/null
$ cat output5.txt

Output:

在这里,第一个命令用于将 df 命令的输出写入文件 output5.txt 中,同时命令的结果不回显在终端中。第二个命令用于查看 output5.txt 文件内容 。

大家都学会了吗?

-----------------

我是良许,世界500强外企 Linux 开发工程师,专业生产 Linux 干货。欢迎关注我的公众号「良许Linux」,回复「1024」获取最新最全的技术资料,回复「入群」进入高手如云技术交流群。

良许 | 命令的输出不会保存?居然连 tee 命令都不会用!的更多相关文章

  1. 显示程序输出并复制到文件(tee 命令)

    Linux tee命令用于读取标准输入的数据,并将其内容输出成文件. tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件. 语法 tee [-ai][--help][--v ...

  2. Linux tee命令详解

    Linux tee命令 Linux tee命令用于读取标准输入的数据,并将其内容输出成文件.如果文件指定为"-",则将输入内容复制到标准输出 tee指令会从标准输入设备读取数据,将 ...

  3. Linux tee命令使用详解分享

    tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出的同时也将内容输出到文件,下面是tee的man 信息 read from standard input and write ...

  4. Linux Shell脚本入门:tee命令

    用途说明   在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee ...

  5. linux tee 命令详解

    man tee: NAME tee - read from standard input and write to standard output and files SYNOPSIS tee [OP ...

  6. [转]linux tee 命令详解

    转自: http://codingstandards.iteye.com/blog/833695 用途说明 在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我 ...

  7. linux常用终端命令(一)终端命令格式(二)文件和目录常用命令

    一.linux终端命令格式 1.终端命令格式 command  [-options]  [parameter] 说明: command :命令名,相应功能的英文单词或单词的缩写 [-options] ...

  8. 良许 | 网络检测神器 ss 命令,你可能根本就不会用!

    今天我们来介绍一下 Linux ss 命令. ss 是 Socket Statistics 的缩写,用来统计 socket 连接的相关信息,它跟 netstat 差不多,但有着比 netstat 更强 ...

  9. linux重定向总结:如何将shell命令的输出信息自动输出到文件中保存

    在做批量实验室,例如跑批量MR的作业,我们会写好shell脚本,然后启动脚本,等所有作业执行完再去看结果,但是这些执行时的信息如何保存下来到文件中呢?下面这个命令可以完成这个任务. sh batchj ...

随机推荐

  1. 基于kubernetes自研容器管理平台的技术实践

    一.容器云的背景 伴随着微服务的架构的普及,结合开源的Dubbo和Spring Cloud等微服务框架,宜信内部很多业务线逐渐了从原来的单体架构逐渐转移到微服务架构.应用从有状态到无状态,具体来说将业 ...

  2. 通过ping命令了解三层转发流程

    ping命令:因特网包探索器.本文主要通过路由器两端不同网段PC互ping来讲解三层转发流程. 例子:PC-A是如何 ping 通 PC-C 的,有几种情况? 说明:1.在条件1阶段PC-C不会刷新a ...

  3. 线上调试bug

    在以往的工作中,线上一有bug,就需要把文件弄到本地来改,但经常会碰见本地环境又和线上不一样,导致调试困难,闭着眼睛改好之后传到线上去看对不对,不对的话又要改,循环往复,要多麻烦就有多麻烦啊. 今天给 ...

  4. Keil uVision4 ——如何新建一个项目

    一.打开Keil4软件,点击Project,再点击New μVision Projrct. 二.新建一个文件夹,并在里面输入这个项目的名字. 三.点击Intel,根据实际情况选择,这里选择的是80/8 ...

  5. poj 1205 :Water Treatment Plants (DP+高精度)

    题意:有n个城市,它们由一个污水处理系统连接着,每个城市可以选择 1.将左边城市过来的污水和右边城市过来的污水连同本身的污水排到河里  >V< 2.将左边来的污水连同自己的污水排到右边   ...

  6. input属性设置type="number"之后, 仍可输入e, E, -, + 的解决办法

    <el-input v-model="scope.row.variables.leaderbuweiscores.score" @keyup.native="cha ...

  7. Java动态,安全追踪工具

    Java动态,安全追踪工具 在我们日常的开发中,总是难以避免的要解决线上的问题.如果线上的问题我们在本地调试的时候无论调试多少次发现明明本地调用了这个方法呀,怎么线上就是没调呢?还有就是出了问题的时候 ...

  8. abp(net core)+easyui+efcore实现仓储管理系统——使用 WEBAPI实现CURD (十二)

    abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...

  9. Liunx C 编程之多线程与Socket

    多线程 pthread.h是linux特有的头文件,POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准.该标准定义了创建和操纵线程的一整套API.在类Unix操 ...

  10. 编码规范 | Java函数优雅之道(上)

    导读 随着软件项目代码的日积月累,系统维护成本变得越来越高,是所有软件团队面临的共同问题.持续地优化代码,提高代码的质量,是提升系统生命力的有效手段之一.软件系统思维有句话“Less coding, ...