Tee并非毫无用处

Tee并非毫无用处

所有用法tee我所见过的都是这样的:

 do_something | tee -a logfile

或者:

do_something_else | tee logfile

tee为那些不知道可以使用 shell 管道重定向做同样事情的人发明的吗?例如:

do_something >> logfile

或者:

do_something_else > logfile

它实际上是一样的,而且输入起来不需要太多键盘敲击。我没看到哪些隐藏功能tee

答案1

你看不到的是do_something | tee -a logfile将输出放入logfile 到 stdout,同时do_something >> logfile将其仅有的进入日志文件。

其目的tee是产生一个输入、多个输出的场景——就像“T”形交叉一样。

编辑

有评论说如何tee实现更无缝的使用sudo。这与主题无关:或者cat,如果您不需要多个输出,dd也许最好提供这种可能性并提供更好的性能。使用它的设计,而不是它“也可以做什么”buffertee

答案2

Tee并非毫无用处

也许你已经知道了?如果不知道,请继续阅读!或者如果你知道它是如何工作的,但不确定为什么如果存在,请跳到最后查看它如何与 Unix 哲学相适应。

什么的目的tee

最简单的方法是,它从标准输入获取数据,并将其写入标准输出和一个(或多个)文件。它被比作一个管道三通它将一个输入分成两个输出(和两个方向)。

例子

让我们来看看第一个例子:

do_something | tee -a logfile

这将获取输出do_something并将其附加到日志文件,同时还将其显示给用户。事实上,维基百科页面tee这是第二个例子:

要查看命令的输出并将其附加到现有文件:

  lint program.c | tee -a program.lint

这将在计算机上显示 lint program.c 命令的标准输出,同时将其副本附加到 program.lint 文件的末尾。如果 program.lint 文件不存在,则创建该文件。

下一个例子还有另一种用途:权限升级

允许提升权限:

cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"

此示例显示使用 tee 绕过命令中的固有限制sudosudo无法将标准输出通过管道传输到文件。通过将其标准输出流转储到/dev/null,我们还抑制了控制台中的镜像输出。通过将用户的公钥安装到服务器的密钥授权列表中,上述命令使当前用户能够通过 ssh 访问服务器的 root 权限。

或者也许您想要获取一个命令的输出,将其写入某处并将其用作另一个命令的输入?

您还可以使用 tee 命令将命令的输出存储到文件,并将相同的输出重定向作为另一个命令的输入。

以下命令将备份 crontab 条目,并将 crontab 条目作为输入传递给 sed 命令进行替换。替换后,它将被添加为新的 cron 作业。

$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –

(归功于Tee 命令使用示例

Tee与 Unix 哲学一致:

编写只做一件事的程序,并做好它。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。

(归功于Unix 哲学基础

tee适合所有这些:

  • 它只做一件事:创建输入的额外副本
  • 它与其他程序兼容,因为它是粘合剂(或者如果你愿意,也可以称之为“T”形管道件),使其他程序能够像上面的例子一样协同工作
  • 它通过操作标准输入的文本流来实现这一点

答案3

它实际上是相同的,并且需要更少的键盘敲击来输入。

根本就不一样啊……

下面的内容看起来有些等同,但事实并非如此:

$ echo "hi" > test.txt
$ echo "hi" | tee test.txt
hi

关键的区别在于前者仅将数据写入命名文件,而后者将数据写入hi终端(stdout命名的文件,如下所示:

重定向与 T 型


tee允许您将数据写入文件在前向管道中使用它,可以让你做一些有用的事情 - 例如保留管道中途的数据:

grep '^look ' interesting_file.txt \
  | tee interesting_lines.txt \
  | sort

或者,你可以使用提升的权限写入文件,而无需赋予整个管道提升的权限(此处,echo和 shell 以用户身份运行,而 以tee身份写入文件root):

echo 0 \
  | sudo tee /proc/sys/net/ipv4/ip_forward

使用tee,您可以写入许多文件( stdout):

echo "hi" \
  | tee a.txt b.txt

还可以使用execwithtee将脚本的所有输出记录到文件中,同时仍允许观察者 ( stdout) 查看数据:

exec > >( tee output.log )

答案4

>不。您恰好提到了少数几个可以使用和运算符重定向到文件的示例之一>>

但 Tee 能做的远不止这些。因为你可以通过管道连接到它,所以你还可以通过管道连接到其他东西。

一个很好的例子列在维基百科页面

find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt

基本上,您可以通过管道传输到 Tee,然后可以从 Tee 传输到其他内容。如果您只想写入日志文件,那么您实际上并不需要 Tee。

相关内容