使用tee有什么意义?


47

为什么几乎所有有关将文本附加到系统文件的说明都喜欢fstab/etc/apt/sources.list.d/<name>.list涉及使用tee echo附加所述文本?

采取以下以root身份运行的示例:

## 1
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | tee -a file1
## 2
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' >> file2

运行不diff -u file1 file2返回任何内容;运行md5sum file1 file2表明它们的校验和是相同的,这使我回到了最初的问题:

为什么| tee <FILENAME>整个Ubuntu的文档非常流行,它只是很好的做法,否则将不会是更容易,只需使用例如2,而不是传递输出echotee


1
您在命令中缺少sudo;这将显示2之间的不同结果;)
Rinzwind'1

1
@Rinzwind我以超级用户身份运行这些命令。
2014年

Answers:


83

区别在于:tee复制输出:将其发送到文件和显示器。

但是还有更多:

  • 例如,如果要一次将某个字符串写入两个文件,则可以使用带有tee的命令:

     echo "some text" | tee file1 > file2  
    
  • tee可以帮助您的另一件事是避免在使用sudo时遇到一个问题。正常的输出重定向操作符始终以您的用户权限执行,当您在生成STDOUT文本的命令前编写sudo时也是如此。换句话说,如果您没有写入该文件的权限,这将失败:

     sudo echo "something" > bar  
    

    但是有了tee,一切都会顺利进行:

    echo "something" | sudo tee bar  
    

该站点的 2个示例。还有更多。


你可以sudotee- sudo sh -c 'echo SOMETHING > FILE'...;)
维尔夫

7
@wilf是的,但是当您需要输出引号时",事情就会变得混乱
Braiam 2014年

3
在第一种情况下,如果您要写入N个文件,则我不想这样做,如果您不想在stdout上弄乱,则最好echo "some text" | tee file1 file2 ... fileN添加> /dev/null
Elmar Zander 2014年

好人@ElmarZander :)
Rinzwind 2014年

13

tee采用标准输入流并将其写入到这两个标准输出流以及一个文件流。如果它可以帮助人们记住,则命令名称来自管道中的T型分割器。Wikipedia上有一篇不错的文章,使我了解了命令名称的由来。

在此处输入图片说明 在此处输入图片说明


11

首先,tee它本身不会添加文本,也不会添加文本>

附录文本就是tee -a它的补充>>

我不相信所有的shell都支持该>>功能,所以这就是为什么tee更常用的原因。(以为只是旧的sh)。Tee是命令,而>>运算符是。

如果你使用(我个人最喜欢的)bash>并且>>是好得多/容易。

使用tee还可以让您sudo只是该命令,因此您不必像那样对整个语句进行sudo sudo sh -c "echo foo > bar"tee还允许您拆分输出。当然,所有这些都可以在中看到man tee。这主要只是您的个人喜好。

有关更多阅读,请参见此处此处


5
对于“ sudo JUST that command”的澄清,对于任何发现这一点有点复杂的人:使用like sudo somecommand >> filea会运行表格sudo somecommand,然后作为调用用户,将输出附加到filea。使用sudo sh -c "somecommand >> filea"作品,但可能引起嵌套引用的噩梦。using somecommand | sudo tee -a fileasomecommand作为调用用户运行的,然后将输出附加filea为root-这通常是用户想要的。
Darael 2014年

@Darael我编辑了帖子。感谢您的澄清。
卡兹·沃尔夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.