人生苦短,务必性感。
输出包含两种类型:一种是程序的运行结果(标准输出),一种是状态和错误信息(标准错误)。
tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出同时也将内容输出到文件
命令格式:
tee [OPTION] [FILE]
参数:
下面我们通过几个应用场景来熟悉下tee命令的使用:
现在我们希望输出到控制台的同时,将输出到控制台的内容保存到当前目录下的某个文件中
[mysql@localhost ~]$ ping baidu.com | tee test.log
我们也可以将输出到控制台的内容保存到指定路径的某个文件中
[mysql@localhost ~]$ ping baidu.com | tee /home/test.log
注意:执行上面命令,我们既能在屏幕上看到输出内容,也能把输出保存到文件中。如果我们不想在屏幕上看到输出,只想把输出保存到文件中,我们可以把输出重定向到文件中,比如:
[mysql@localhost ~]$ ping baidu.com >test.txt
上面的操作中,输出到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
是不是觉得test.log 文件名称太单调了,没有很好的标识性?别急,我们可以给文件名称后面加上当前时间,一下子就高大上了
[mysql@localhost ~]$ ping baidu.com | tee test_`date +%Y%m%d_%H%M%S`.log #文件名称为test_20201021_110355.log
上面的实例都是将输出写到一个文件中,我们也可以一次写到多个文件中,这样就不怕误删了
直接在tee命令后面追加待输入的文件名即可,具体格式是:
[mysql@localhost ~]$ ping baidu.com | tee test.log test2.log test3.log
通俗来说,就是在终端窗口重复显示
tee - #输出到标准输出两次
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
上图可以看出,test.log内容已不是空的了,记录了标准错误。
我们再执行命令过程中,手贱按了下 ctrl+c 组合键,直接回中断执行。
使用 -i 参数可以忽视由 ctrl+c 组合键发起的中断信号(SIGINT)
ping baidu.com | tee -i test.log
这时候你就可以随心所欲按ctrl+c了。
这个场景的使用很有意思,有时用起来真的很香。
例如,我们有时候配置某个文件的时,配置完了,在保存的时候,发现当前用户没有保存权限,这时候内心一万句×××,其实用tee命令就可以解决我们的烦恼。
具体的操作就是在文件保存的时候输入:w !sudo tee %,这时候会提醒你输入密码,正确输入密码后,文件就保存了,此时你可以使用:q!退出文件了。