如果您曾经在 Linux shell 中使用过管道和重定向,有时您需要使用 tee
实用程序。
Tee 持有什么?
类似ls
的命令会显示当前目录的内容。换句话说,它将这些内容显示到标准输出(标准输出)中,通常是您的屏幕,或者更准确地说是虚拟终端屏幕。
类似ls >的命令file123
不会在屏幕上显示任何内容。这是因为 >
符号将所有输出重定向到文件,而不是将其显示为标准输出。现在 file123 将被之前屏幕上显示的内容填充。
要在屏幕上显示文件夹的内容并将其写入文件,您必须使用两个命令。但是使用 tee
,您可以同时做到这两点。
ls | tee file123
当你可以运行两次类似的命令时,为什么要使用 Tee?
在上面的例子中,很明显如果可以正常执行ls
就不需要tee
了,然后重做并将输出重定向到文件。但是,您会遇到输出是唯一的情况。想象一下您试图诊断问题的情况。你跑:
诊断 | tee error.log
你得到的错误可能是独一无二的。您希望它们显示在屏幕上,以便在检查所有内容时可以看到发生了什么。但您也希望将这些错误保存在一个文件中,以便稍后查看或将输出粘贴到论坛中并就此咨询人们。
您可能需要 tee
的另一种常见情况是,您希望将命令的输出带到只有 root 用户可以阅读或写。以下命令不起作用:
/sbin/blkid >/root/somefile
那你可能会想,就用 sudo
吧!但是当这个命令也不起作用时,你会感到惊讶:
sudo blkid >/root/somefile
那是因为在sudo blkid
执行后,你仍然以非root 用户登录。您的 shell(通常是 bash)会尝试使用您的常规用户信息写入 /root/somefile。要解决这个问题,您可以使用 tee
:
/sbin/blkid | sudo tee/root/somefile
附加文本和重定向错误
Tee
是一个简单但有用的命令。一个命令| tee somefile
基本命令| tee somefile
通常足以满足大多数情况。但是,在 2 种情况下您需要这些提示。
首先要知道的是 tee
,默认情况下,总是覆盖文件。如果你运行:
ls | tee somefile
然后运行:
ls/tmp | tee somefile
第二个命令会覆盖somefile的内容,你只会看到最后执行的命令的内容。要更改此行为,您可以创建链接 tee
的文本,而不是覆盖。为此,只需使用 -a 切换命令。
ls | tee-a somefile
第二件要知道的是,并不是所有的输出都是一样的。错误消息的处理方式不同,尽管它们出现在屏幕上,但它们不被视为标准输出,而是被视为标准错误,而不由 tee
处理。以下是 grep
的示例。
grep-r L2TP/etc | tee somefile
显示的结果如下图所示:
通知Permission denied被写入stderr。唯一写入标准输出的是突出显示的文本。这就是为什么您会注意到 'somefile' 的内容如下图所示:
在这种情况下,grep
用于搜索文本,并且在错误消息未重定向到文件时很有用。错误消息只会用不必要的信息填充文件。您只想查看找到的结果。但是当您需要错误消息时,请使用 2>&1
,将 stderr 重定向到 stdout。
grep-r L2TP/etc 2>&1 | tee somefile
使用此命令,您会注意到 somefile 现在也包含错误消息。
希望本指南包含充分利用 tee
所需的一切。但是如果你在使用 tee
遇到一些困难的情况,请在下面的评论部分留下评论,供大家分享。
祝你使用成功的tee
命令!
urenrjrjkvnm
Vikiyij
2023-08-15