LinuxTee命令是一个命令行工具,它从标准输入读取结果并将结果写入标准输出和文件。在Linux中使用tee命令可以一箭双雕:从标准输入读取结果,同时将结果打印到文件和标准输出。还是不明白,什么意思?在本指南中,我们将更详细地解释Linuxtee命令,并使用一些示例来演示其用法。Tee命令语法tee命令语法非常简单,采用以下格式:$teeoptionsfile下面是一些可以与tee命令一起使用的选项:linuxmi@linuxmi:~/www.linuxmi.com$tee--help用法:tee[options]...[FILE]...将标准输入复制到每个指定文件并显示到标准输出。-a,--append将内容附加到给定文件而不是覆盖-i,--ignore-interrupts忽略中断-p解决写入非管道的问题--output-error[=mode]设置错误时的写入行为。请参阅下面的“模式”部分--help显示此帮助消息并退出--version显示版本信息并退出模式确定错误写入输出时的行为:'warn'诊断任何文件的输出错误'warn-nopipe'诊断错误输出到除管道以外的任何文件'exit'出错时退出程序输出'exit-nopipe'出错时退出程序和非管道输出-p选项的默认模式是“warn-nopipe”。当未给出--output-error时,默认操作是在写入管道错误时立即退出,并诊断写入非管道错误时的问题。在tee命令的语法中,file是指一个或多个文件。让我们看看这个命令是如何使用的。示例1–tee命令的基本用法如前所述,tee命令的主要功能是显示命令的输出(stdout)并将其保存到文件中。在下面的示例中,我们检查系统中的块设备并将结果发送到tee命令,该命令将输出显示到终端,同时将其保存在名为www.linuxmi.com.txt的新文件中:linuxmi@linuxmi:~/www.linuxmi.com$lsblk|teewww.linuxmi.com.txt可以使用cat命令检查www.linuxmi.com.txt文件的内容,如下所示:catwww.linuxmi.com.txt示例2–使用tee将命令输出保存到多个文件此外,您可以将命令的输出写入多个以空格分隔的文件,如下面的语法所示。$command|teefile1file2file3...linuxmi@linuxmi:~/www.linuxmi.com$hostnamectl|teelinuxmi.txtlinuxmi.com.txt同样,您可以使用cat命令确认两个文件中是否存在输出,如下所示:catlinuxmi.txtcatlinuxmi.com.txtExample3–Disableteecommandoutputonscreen如果要隐藏或禁止tee命令在屏幕上输出,请将输出重定向到/dev/null,如图:$command|teefile>/dev/null例如,linuxmi@linuxmi:~/www.linuxmi.com$df-Th|teelinuxmi.txt>/dev/nulllinuxmi@linuxmi:~/www.linuxmi.com$uname-a|teelinuxmi.txt>/dev/nulllinuxmi@linuxmi:~/www.linuxmi.com$catlinuxmi.txtLinuxlinuxmi5.4.0-48-generic#52-UbuntuSMPThuSep1010:58:49UTC2020x86_64x86_64x86_64GNU/Linux示例4–使用tee命令将输出附加到文件中默认情况下,tee命令覆盖文件的内容(如示例3)。要附加输出并防止擦除当前内容,请使用-a或--append选项。$command|tee-afile在第二个命令中,如图所示,我们将date命令的输出附加到linuxmi.com.txt,其中已经包含有关系统上USB设备的信息。linuxmi@linuxmi:~/www.linuxmi.com$lsusb|teelinuxmi.com.txtlinuxmi@linuxmi:~/www.linuxmi.com$date|tee-alinuxmi.com.txt示例5-使用tee和sudo命令假设作为sudo用户,您想写入root拥有的文件。当然,任何提升的操作都需要在命令之前调用sudo用户。为此,只需在tee命令前添加sudo,如下所示。linuxmi@linuxmi:~/www.linuxmi.com$echo"192.168.1.100db-01"|sudotee-a/etc/hosts所以左边的tee接收echo命令的输出,并用sudo命令提升它,最终将输出追加到文件中。示例6–使用tee命令将一个命令的输出重定向到另一个命令使用tee命令,我们可以轻松地将一个命令的输出重定向到另一个命令。这里第一个命令的输出将用作第二个命令的输入。这是一个例子:linuxmi@linuxmi:~/www.linuxmi.com$grep'root'/etc/passwd|tee/tmp/passwd.tmp|wc-l例子7-使用tee命令保存对Vim的更改编辑文件假设你是一个非root用户,你正在对root拥有的文件进行更改,但是忘记在命令前面加上sudo,现在你想保存更改,例如:linuxmi@linuxmi:~/www.linuxmi.com$vim/etc/hosts保存对文件的更改时,会收到只读信息,/etc/hosts"E212:CannotopenandwritetothefileNowtosavechangestothe/在Vim编辑器中运行etc/hosts文件,运行:w!sudotee%它会提示你输入用户密码,如果用户有sudo权限那么更改将被保存。例8–使用tee命令时忽略中断信号使用tee命令中的“-i”选项忽略中断信号(CTRL-C),示例如下:linuxmi@linuxmi:~/www.linuxmi.com$ping-c5linuxmi。com|tee-i/tmp/pingtest.tmp示例9–Tee命令在shell脚本中的使用script.sh#!/bin/bashLOGFILE=/tmp/basic-logs-$(date+%d%m%Y)FLAVOR=$(cat/etc/*-release|grep-w'NAME='|cut-d"="-f2|awk'{print$1}'|sed's/"//g')if[$FLAVOR==CentOS];thendmesg|grep-i'error'|tee-a$LOGFILEgrep-i'installed'/var/log/dnf.log|tee-a$LOGFILEelseseecho'donothing'fi正如我们在上面的Linuxshell脚本中看到的,我们使用tee命令将两个命令的输出追加到日志文件中间.
