问题描述
为什么几乎所有关于将文本附加到系统文件(如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
显示他们的md5sums是相同的,这让我回到我原来的问题:
为什么| tee <FILENAME>
在Ubuntu文档中如此普遍,这只是一个好习惯,否则只是使用示例2而不是将输出从echo
传递给tee
会不会更容易?
最佳解决方案
有一点不同:tee复制输出:它将它发送到文件和显示器。
但还有更多:
-
例如,如果要一次将一些字符串写入两个文件,可以使用的tee命令是:
echo "some text" | tee file1 > file2
-
T恤可以帮助您的另一件事是在使用sudo时避免一个问题。正常输出重定向操作符始终使用您的用户权限执行,当您在生成STDOUT文本的命令前面编写sudo时也是如此。换句话说,如果您没有写入该文件的权限,这将失败:
sudo echo "something" > bar
但是通过发球台,一切都会顺利进行:
echo "something" | sudo tee bar
来自this site的2个示例。还有一些。
次佳解决方案
首先,tee
本身不附加文本,也不附加>
。
它是文本的tee -a
及其补充,>>
。
我不相信所有的shell都支持>>
功能,所以这就是tee
更常用的原因。 (想想只是普通的旧sh
)。 Tee是一个命令,而>>
是一个操作员。
如果您使用(我个人最喜欢的)bash
,>
和>>
更好/更容易。
使用tee
还允许你sudo JUST该命令,因此你不必sudo整个语句,如在sudo sh -c "echo foo > bar"
中。 tee
还允许您分割输出。当然,所有这一切都可以在man tee
中看到。这主要是您个人的偏好。
第三种解决方案
tee
获取标准输入流并将其写入标准输出流和文件流。如果它可以帮助人们记住,命令名称来自管道中的T-splitter。有一个很好的Wikipedia article,我在那里了解了命令名称的来源。