tee
命令是一个命令行工具,它从标准输入读取数据,同时将结果打印到文件中和标准输出到屏幕中。
即我们在写脚本时会打印一些提示,我们既希望它能输出到屏幕上给使用者提示,也希望它保存到日志文件中,方便以后查看,那么我们可以使用该命令来完成。
如ls /root/ > log.txt
命令也可以将命令的输出保存到log.txt文件中,但却不会把命令的输出显示到屏幕上了。而如果我们同时希望它既输出到屏幕又保存到文件中,可以这样写:ls /root/ | tee log.txt
。
tee
命令的基本语法如下:
tee [选项] [参数]
常用选项如下:
选项 | 描述 |
---|---|
-a | 将命令输出附加到文件的后面,而非覆盖它 |
-i | 忽略中断信号 |
–help | 查看帮助信息 |
–version | 显示版本信息 |
参数就是要保存数据的文件。
将ls /root/
命令执行的输出结果同时显示到屏幕并且保存到log.txt文件中。
ls /root/ | tee log.txt
还可以将命令的输出保存到多个文件中,多个文件路径通过空格进行分隔。如下:
ls /root/ | tee log1.txt log2.txt log3.txt
我们希望将命令的输出保存到文件,但是不想要输出结果显示在屏幕上了,那么可以将输出重定向到/dev/null
。
ls /root/ | tee log.txt > /dev/null
默认情况下,tee
命令每次执行都会覆盖文件的原有内容,如果想要追加防止覆盖原有内容则可以使用-a
或--append
选项。
ls /root/ | tee log.txt date | tee -a log.txt
我们希望将一个命令的输出结果既保存到某个文件中,又希望该输出结果能重定向输出到另外一个命令。如:
# 统计/etc/passwd文件中root的行数 grep 'root' /etc/passwd | wc -l # 但我们希望将grep命令的查询结果保存到test.txt中,并且也统计出现行数,那么就可以使用tee命令 grep 'root' /etc/passwd | tee test.txt | wc -l
如果在shell脚本中函数有多条输出,可能是日志也可能是提示,我们希望它既能显示在屏幕上,也会保存到日志文件中,方便以后查看,那么我们可以直接写一个主函数,然后将主函数中调用其他函数,最后在主函数后面使用tee
命令将所有函数的所有输出都打印到屏幕上并且保存到文件中:
#!/bin/bash main(){ local x=1 local y=2 echo "compare starting..." if [ $x -eq $y ]; then echo "x==y" else echo "x!=y" fi echo "compare ending..." } main | tee -a log.txt #将main函数的所有输出都打印到屏幕上并保存到文件中