Linux Shell编程 | tee命令各种使用场景详解

 Linux Shell编程 | tee命令各种使用场景详解

人生苦短,务必性感。

前言

输出包含两种类型:一种是程序的运行结果(标准输出),一种是状态和错误信息(标准错误)。

  • 标准输出(standard output)和 标准错误(standard error),默认是连接至屏幕
  • 标准输入(standard input) 默认是连接至键盘

tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出同时也将内容输出到文件

 

tee命令介绍

命令格式:

tee [OPTION] [FILE]

参数:

  • -a 附加到既有文件的后面,不覆盖它前面内容
  • -i  忽略中断信号
  • --help  帮助
  • --version  查看版本信息

 

下面我们通过几个应用场景来熟悉下tee命令的使用:

1、向文件里面写入内容

现在我们希望输出到控制台的同时,将输出到控制台的内容保存到当前目录下的某个文件中

[mysql@localhost ~]$ ping baidu.com | tee test.log

 

我们也可以将输出到控制台的内容保存到指定路径的某个文件中

[mysql@localhost ~]$ ping baidu.com | tee /home/test.log

 

注意:执行上面命令,我们既能在屏幕上看到输出内容,也能把输出保存到文件中。如果我们不想在屏幕上看到输出,只想把输出保存到文件中,我们可以把输出重定向到文件中,比如:

[mysql@localhost ~]$ ping baidu.com >test.txt

 

2、 向文件里面追加内容

上面的操作中,输出到test.log,如果这个文件已经存在,再次使用ping baidu.com | tee test.log,则会将文件里面的内容全部清除,重新再写入新的内容。

对于某些场景这种方式是不适合的,我们希望每次的输出都是是追加到文件里面,这时我们可以通过

-a参数来指定

[mysql@localhost ~]$ ping baidu.com | tee -a test.log

[mysql@localhost ~]$ ping baidu.com | tee -a /home/test.log

 

3、给文件名加个时间小尾巴

是不是觉得test.log 文件名称太单调了,没有很好的标识性?别急,我们可以给文件名称后面加上当前时间,一下子就高大上了

[mysql@localhost ~]$ ping baidu.com | tee test_`date +%Y%m%d_%H%M%S`.log  #文件名称为test_20201021_110355.log

Linux Shell编程 | tee命令各种使用场景详解_第1张图片

 

4、如何同时输出到多个文件?

上面的实例都是将输出写到一个文件中,我们也可以一次写到多个文件中,这样就不怕误删了

直接在tee命令后面追加待输入的文件名即可,具体格式是:

[mysql@localhost ~]$ ping baidu.com | tee test.log test2.log test3.log

 

5、输出到标准输出多次

通俗来说,就是在终端窗口重复显示

tee -        #输出到标准输出两次 

tee - -      #输出到标准输出三次

 

6、2>&1 把标准错误也被 tee 读取

难道标准错误就没有办法被输出吗?那多没意思,别急方法是有的,请往下看:

2>&1是什么意思?

2>&1应该分成两个部分来看,一个是2>以及另一个是&1,

其中2>就是将标准出错重定向到某个特定的地方;&1是指无论标准输出在哪里。

所以2>&1的意思就是说无论标准出错在哪里(哪怕是没有),都将标准出错重定向到标准输出中。

 

文章开头就说过,在使用管道符时,前一个命令的标准错误输出不会被tee读取。比如,

[mysql@localhost ~]$ cat 999.txt|tee test.log #错误的输出不会写到test.log文件中

如上图,虽然终端窗口显示了错误信息:cat: 999.txt: 没有那个文件或目录,但此时test.log内容空的。

此时,2>&1就派上用场了,

cat 999.txt 2>&1|tee test.log

Linux Shell编程 | tee命令各种使用场景详解_第2张图片

上图可以看出,test.log内容已不是空的了,记录了标准错误。

 

7、如何让tee忽略中断事件

我们再执行命令过程中,手贱按了下 ctrl+c 组合键,直接回中断执行。

使用 -i 参数可以忽视由 ctrl+c 组合键发起的中断信号(SIGINT)

ping baidu.com | tee -i test.log

这时候你就可以随心所欲按ctrl+c了。

 

8、通过使用tee命令来提高写入文件的权限等级

这个场景的使用很有意思,有时用起来真的很香。

例如,我们有时候配置某个文件的时,配置完了,在保存的时候,发现当前用户没有保存权限,这时候内心一万句×××,其实用tee命令就可以解决我们的烦恼。

具体的操作就是在文件保存的时候输入:w !sudo tee %,这时候会提醒你输入密码,正确输入密码后,文件就保存了,此时你可以使用:q!退出文件了。

 

 

你可能感兴趣的:(shell,linux)