使用tee有什么意义吗?

Ale*_*ura 62 command-line tee

为什么是它关于文本追加到系统文件一样,几乎所有的指令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
Run Code Online (Sandbox Code Playgroud)

运行diff -u file1 file2没有任何回报;运行md5sum file1 file2显示他们的校验和是相同的,这让我回到我原来的问题:

为什么| tee <FILENAME>在 Ubuntu 文档中如此普遍,这只是一种很好的做法,否则仅使用示例 2 而不是将输出从echoto传递会不会更容易tee

Rin*_*ind 99

有一个区别:tee 复制输出:它将它发送到文件和显示器。

但还有更多:

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

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

     sudo echo "something" > bar  
    
    Run Code Online (Sandbox Code Playgroud)

    但是有了 T 恤,一切都会顺利:

    echo "something" | sudo tee bar  
    
    Run Code Online (Sandbox Code Playgroud)

来自该站点的2 个示例。它还有一些。

  • @wilf 是的,但是当您需要输出引号`"` 时,事情变得混乱 (7认同)
  • 在第一种情况下,如果你想写入 N 个文件,我宁愿`echo "some text" | tee file1 file2 ... fileN` 并且可能附加 `&gt; /dev/null`,如果您不想让 stdout 出现混乱。 (4认同)

use*_*339 22

tee采用标准输入流并将其写入到这两个标准输出流以及一个文件流。如果它有助于人们记住,命令名称来自管道中的 T 型分离器。有一篇不错的维基百科文章,我在其中了解了命令名称的由来。

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


Kaz*_*lfe 15

首先,tee它本身不附加文本,>.

附加文本是tee -a它及其补充>>

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

如果您使用 (我个人最喜欢的) bash>并且>>更好/更容易。

Usingtee还允许您只 sudo 该命令,因此您不必 sudo 整个语句,如sudo sh -c "echo foo > bar". tee还允许您拆分输出。当然,这一切都可以在man tee. 这主要只是你的个人喜好。

如需进一步阅读,请参阅此处此处

  • 澄清“sudo JUST that command”,对于发现这有点复杂的任何人:使用像`sudo somecommand &gt;&gt; filea`这样的形式将运行`sudo somecommand`,然后作为*调用*用户,将输出附加到`filea `. 使用 `sudo sh -c "somecommand &gt;&gt; filea"` 可以工作,但会导致嵌套引用的噩梦。使用`somecommand | sudo tee -a filea` 以调用用户的身份运行 `somecommand`,然后以 root 身份将输出附加到 `filea` - 这通常是用户想要的。 (7认同)