tee我见过的所有用法都是这样的:
do_something | tee -a logfile
Run Code Online (Sandbox Code Playgroud)
或者:
do_something_else | tee logfile
Run Code Online (Sandbox Code Playgroud)
是tee为那些不知道你可以用 shell 管道重定向做同样的事情的人发明的吗?如:
do_something >> logfile
Run Code Online (Sandbox Code Playgroud)
或者:
do_something_else > logfile
Run Code Online (Sandbox Code Playgroud)
它实际上是一样的,而且打字所需的键盘敲击次数更少。我没有看到哪些隐藏功能tee?
Eug*_*eck 246
您没有看到的是do_something | tee -a logfile将输出放入logfile 和放入标准输出,而仅do_something >> logfile将其放入日志文件。
的目的tee是产生一个输入、多个输出的场景——就像在“T”交叉中一样。
编辑
关于如何tee更无缝地使用sudo. 这是无关紧要的:cat,dd或者buffer如果您不需要多个输出,则可以更好地提供具有更好性能的这种可能性。使用tee它所设计,而不是什么“也可以做”
ber*_*ieb 121
Tee 不是没用也许你知道吗?如果没有,请继续阅读!或者,如果您知道它是如何工作的,但不确定它为什么存在,请跳到最后以了解它如何与 Unix 哲学相适应。
tee?最简单的是,它获取标准输入上的数据并将其写入标准输出和一个(或多个)文件。在将一个输入分成两个输出(和两个方向)的方式上,它被比作管道三通。
让我们以你的第一个例子为例:
do_something | tee -a logfile
Run Code Online (Sandbox Code Playgroud)
这将获取输出do_something并将其附加到日志文件,同时还将其显示给用户。事实上,维基百科页面上tee的第二个例子是:
要查看命令的输出并将其附加到现有文件:
Run Code Online (Sandbox Code Playgroud)lint program.c | tee -a program.lint这会在计算机上显示 lint program.c 命令的标准输出,同时将其副本附加到 program.lint 文件的末尾。如果 program.lint 文件不存在,则会创建它。
下一个示例还有另一个用途:权限升级:
允许升级权限:
Run Code Online (Sandbox Code Playgroud)cat ~/.ssh/id_rsa.pub | ssh admin@server "sudo tee -a /root/.ssh/authorized_keys2 > /dev/null"此示例显示 tee 用于绕过
sudo命令中的固有限制。sudo无法将标准输出通过管道传输到文件。通过将其标准输出流转储到 中/dev/null,我们还抑制了控制台中的镜像输出。上面的命令通过将用户的公钥安装到服务器的密钥授权列表,让当前用户通过 ssh 访问服务器。
或者,也许您想获取一个命令的输出,将其写在某处并将其用作另一个命令的输入?
您还可以使用 tee 命令将命令的输出存储到文件中,并将相同的输出作为输入重定向到另一个命令。
以下命令将备份 crontab 条目,并将 crontab 条目作为输入传递给将执行替换的 sed 命令。替换后,将作为新的cron作业添加。
Run Code Online (Sandbox Code Playgroud)$ crontab -l | tee crontab-backup.txt | sed 's/old/new/' | crontab –
(归功于Tee 命令用法示例)
Tee 与 Unix 哲学一起工作:编写只做一件事并把它做好的程序。编写程序以协同工作。编写程序来处理文本流,因为这是一个通用接口。
(归功于Unix 哲学的基础知识)
tee 适合所有这些:
Att*_*tie 70
它实际上是一样的,而且打字所需的键盘敲击次数更少。
完全不一样...
以下似乎有些等价,但它们不是:
$ echo "hi" > test.txt
Run Code Online (Sandbox Code Playgroud)
$ echo "hi" | tee test.txt
hi
Run Code Online (Sandbox Code Playgroud)
关键的区别在于前者只将数据写入了命名文件,而后者写入hi了终端(stdout)和命名文件,如下所示:
tee允许您将数据写入文件并在向前的管道中使用它,允许您做有用的事情 - 例如在管道的中途保留数据:
grep '^look ' interesting_file.txt \
| tee interesting_lines.txt \
| sort
Run Code Online (Sandbox Code Playgroud)
或者,您可以写入具有提升权限的文件,而无需为整个管道提供提升权限(此处echo,shell 以用户身份运行,同时tee以 身份写入文件root):
echo 0 \
| sudo tee /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)
使用tee,您可以写入多个文件(和 stdout):
echo "hi" \
| tee a.txt b.txt
Run Code Online (Sandbox Code Playgroud)
还可以使用execwithtee将脚本的所有输出记录到文件中,同时仍然允许观察者 ( stdout) 查看数据:
exec > >( tee output.log )
Run Code Online (Sandbox Code Playgroud)
voi*_*ces 28
T形管件。它有一个入口和两个独立的出口。
换句话说,它将一根管子一分为二;就像一个岔路口。
同样,tee管道 ( |) 允许您将标准输入重定向到两个单独的输出。
示例
比如说,您键入ls /。
您将获得类似于以下内容的输出:
Applications Network Users bin dev net private tmp var
Library System Volumes cores etc home opt sbin usr
Run Code Online (Sandbox Code Playgroud)
将输出重定向到文本文件 ,ls / > ls.txt并且 shell 中不显示任何输出,仅在生成的文本文件中显示。
想要查看输出,并同时将其传递给文本文件吗?
将 a 添加tee到您的管道 ( |) 中,即:ls / | tee ls.txt
比较两者:
ls / > ls.txt
ls / | tee ls.txt
Run Code Online (Sandbox Code Playgroud)
LPC*_*hip 18
不。您碰巧提到了少数几个确实可以使用>和>>运算符重定向到文件的示例之一。
但是 Tee 可以做的远不止这些。因为你通过管道连接到它,然后你可以通过管道连接到其他东西。
维基百科页面上列出了一个很好的例子:
find "4DOS" wikipedia.txt | tee 4DOS.txt | sort > 4DOSsorted.txt
Run Code Online (Sandbox Code Playgroud)
基本上,您可以通过管道连接到 Tee,因此您可以通过管道从 Tee 连接到其他东西。如果你只想写一个日志文件,是的,那么你真的不需要 Tee。
UTF*_*F-8 18
tee远非无用。我一直在使用它,很高兴它存在。如果您有要拆分的管道,这是一个非常有用的工具。一个非常简单的例子是,您有一些$d要压缩的目录,并且还想对其进行哈希处理,因为您很偏执(就像我一样)并且不相信存储介质能够可靠地保存数据。您可以先将其写入磁盘,然后对其进行散列,但如果存档在散列之前已损坏,则会失败。此外,您必须阅读它,如果您经常处理数百 GB 大小的文件,您就会知道,如果不是必须的,您真的不想再次阅读它们。
所以我所做的就是这样:
tar -c "$d" | tee >(sha256sum) >(cat > "$d"".tar") > /dev/null
Run Code Online (Sandbox Code Playgroud)
它创建 tar 球并将其通过管道传输到 tee,然后通过管道将其传输到两个子壳,其中一个是散列的,另一个是写入磁盘。
如果您想对一个大文件执行多个操作,这也很棒:
< file.tar.gz tee >(sha256sum) >(tar -xz) /other/storage/location/file.tar.gz > /dev/null
Run Code Online (Sandbox Code Playgroud)
读取文件一次,对其进行哈希处理(这样您就可以检查它是否仍然是它应该的样子),提取它,然后将它复制到不同的位置。没必要为此读三遍。
stu*_*dog 12
在@bertieb 的回答中吹毛求疵说这个例子显示了 tee 被用来绕过 sudo 命令中的固有限制。sudo 无法将标准输出通过管道传输到文件。
没有固有的限制,只是对命令处理方式的误解。
例子:
sudo echo 0 > /proc/sys/net/ipv4/ip_forward
在当前外壳解析命令行。它找到输出重定向并执行它。然后它执行命令,它是sudo并提供剩余的命令行作为执行命令的参数。如果当前 shell 没有 root 权限,则输出重定向将失败。
echo 0 | sudo tee /proc/sys/net/ipv4/ip_forward
这是有效的,因为输出重定向被推迟到tee命令,此时它确实具有 root 权限,因为它是通过sudo.
sudo bash -c "echo 0 > /proc/sys/net/ipv4/ip_forward"
这是有效的,因为执行重定向的 shell 具有 root 权限。
小智 10
正如其他人所提到的,管道输出到tee命令会将输出写入文件和标准输出。
tee当我想从需要很长时间运行的命令中捕获输出时,我经常使用,同时还想在命令使其可用时直观地检查输出。这样,在检查输出之前,我不必等待命令完成运行。
似乎还没有提到的(除非我错过了)是该tee命令还可以一次写入多个文件。例如:
ls *.png | tee a.txt b.txt
Run Code Online (Sandbox Code Playgroud)
将*.png当前目录中的所有文件一次写出到两个不同的文件(a.txt和b.txt)。
事实上,你可以tee像这样一次向几个不同的文件输入文本:
$ tee --append a.txt b.txt c.txt d.txt
These lines are appended to four different files,
and are also written to stdout.
CTRL-D
Run Code Online (Sandbox Code Playgroud)
小智 9
tee 最常见的用途是在将文本发送到文件(或多个文件)的同时在终端上查看文本。您问题的措辞假设您只将文本写入日志文件。我有脚本编写文件名或目录名列表来触发文件(由其他脚本异步处理),我使用 tee 将相同的内容发送到标准输出。所有标准输出都指向日志。所以我在我想要的地方有我的文本,我有一个日志条目记录我这样做,所有这些都来自一个'echo'语句
tee 也是 Unix 中制作多个相同文件的最佳方法。我偶尔会用它来制作多个空文件,就像这样......
:|tee file01 file02 file03
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25350 次 |
| 最近记录: |