Tee 命令

有时候我们需要把命令输出的内容保存为日志, 还想着实时看到命令输出的内容, 怎么办?


tee - read from standard input and write to standard output and files


从标准输入中读取, 输出的同时并写入到文件中。

举几个栗子:

1.输出的同时写入到文件中:

  1. for i in {1..9};do > $RANDOM; done #创建了9个文件
  2. ls #查看一下, 的确创建成功了.
  3. 12681 16993 20566 21822 22742 25812 31954 5965 9458
  4. ls | tee files_of_here #然后用tee将输出保存到文件中
  5. 12681
  6. 16993
  7. 20566
  8. 21822
  9. 22742
  10. 25812
  11. 31954
  12. 5965
  13. 9458
  14. files_of_here #这里有些奇怪, 为什么ls的时候多了一个这样的文件呢?
  15. cat files_of_here
  16. 12681
  17. 16993
  18. 20566
  19. 21822
  20. 22742
  21. 25812
  22. 31954
  23. 5965
  24. 9458
  25. files_of_here # 解答上面的问题, 因为ls和tee是同时进行的,
  26. # 所以, tee 创建文件的时候, ls 还没读完整个目录中的文件名,
  27. # 所以才会有一个files_of_here这样的文件, 如果还不明白, 看下面的例子.

再一个例子:

  1. ls | tee 000 #我们创建一个000的文件
  2. 12681
  3. 16993
  4. 20566
  5. 21822
  6. 22742
  7. 25812
  8. 31954
  9. 5965
  10. 9458
  11. files_of_here
  12. cat 000
  13. 12681
  14. 16993
  15. 20566
  16. 21822
  17. 22742
  18. 25812
  19. 31954
  20. 5965
  21. 9458
  22. files_of_here
  23. ls
  24. 000 12681 16993 20566 21822 22742 25812 31954 5965 9458 files_of_here

看出区别了么? 由于ls和tee是同时进行的,所以谁先得到系统的资源是不一定的,当ls先读取目录之后,就不会输出tee创建的文件,而如果是tee先创建了文件,ls再读取目录的话,就会显示tee创建的新文件。

2.tee和管道

本来tee就是从管道中读取的, 不过, 他也能够输出到管道中, 起到一个数据中转的作用:

  1. cat resout
  2. Give me a...
  3. ... flag!
  4. cat resout | tee content_of_resout | grep flag
  5. ... flag!
  6. cat content_of_resout
  7. Give me a...
  8. ... flag!

3.teevim

如果用vim打开了一个没有写权限的文件, 但是你已经写了很多东西, 那该怎么办?

tee来拯救你.

vim中命令模式下:

  1. :w !sudo tee %

更多的解释在这里:http://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work