Tee 命令
有时候我们需要把命令输出的内容保存为日志, 还想着实时看到命令输出的内容, 怎么办?
tee - read from standard input and write to standard output and files
从标准输入中读取, 输出的同时并写入到文件中。
举几个栗子:
1.输出的同时写入到文件中:
➤ for i in {1..9};do > $RANDOM; done #创建了9个文件
➤ ls #查看一下, 的确创建成功了.
12681 16993 20566 21822 22742 25812 31954 5965 9458
➤ ls | tee files_of_here #然后用tee将输出保存到文件中
12681
16993
20566
21822
22742
25812
31954
5965
9458
files_of_here #这里有些奇怪, 为什么ls的时候多了一个这样的文件呢?
➤ cat files_of_here
12681
16993
20566
21822
22742
25812
31954
5965
9458
files_of_here # 解答上面的问题, 因为ls和tee是同时进行的,
# 所以, tee 创建文件的时候, ls 还没读完整个目录中的文件名,
# 所以才会有一个files_of_here这样的文件, 如果还不明白, 看下面的例子.
➤
再一个例子:
➤ ls | tee 000 #我们创建一个000的文件
12681
16993
20566
21822
22742
25812
31954
5965
9458
files_of_here
➤ cat 000
12681
16993
20566
21822
22742
25812
31954
5965
9458
files_of_here
➤ ls
000 12681 16993 20566 21822 22742 25812 31954 5965 9458 files_of_here
➤
看出区别了么? 由于ls和tee是同时进行的,所以谁先得到系统的资源是不一定的,当ls先读取目录之后,就不会输出tee创建的文件,而如果是tee先创建了文件,ls再读取目录的话,就会显示tee创建的新文件。
2.tee和管道
本来tee就是从管道中读取的, 不过, 他也能够输出到管道中, 起到一个数据中转的作用:
➤ cat resout
Give me a...
... flag!
➤ cat resout | tee content_of_resout | grep flag
... flag!
➤ cat content_of_resout
Give me a...
... flag!
➤
3.tee
和vim
如果用vim
打开了一个没有写权限的文件, 但是你已经写了很多东西, 那该怎么办?
tee
来拯救你.
在vim
中命令模式下:
:w !sudo tee %
更多的解释在这里:http://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work