tee 命令如何工作?

tee 命令如何工作?

在遇到大约 3 个tee我认为缺乏指导意义的解释后,我会要求针对该命令提供一个简单、通用和逐步(如果可能的话)的解释,针对 Linux 新手。

我确实知道我们可以通过管道、命令的标准输出或直接在某个文件上使用它,但我想我错过了该命令实际上对这些内容执行的操作以及它何时有用。

所以这就是我的要求,希望能找到一个说教性的解释,以清晰、循序渐进的方式为新手服务:

  1. 该命令如何与命令的标准输出或文件本身一起使用?

  2. 为什么通常说tee读取标准输入?我的意思是,如果我这样做ls -ltee不会读取语法ls -l本身,而是读取它打印到会话中的标准输出。

另外,如果您愿意,请分享一个您日常工作中的实际例子,什么时候tee对您非常有用?

答案1

tee我的系统上的手册:

tee 实用程序将标准输入复制到标准输出,从而在零个或多个文件中进行复制。输出是无缓冲的。

因此,它从标准输入读取并将其复制到标准输出,同时还将流复制到一个或多个文件中。

在以下管道中,tee将获取管道中第一个命令的输出并将其复制到标准输出(终端),同时还在文件onetwo和中复制它three

$ somecommand | tee one two three

tee有很多用途,其中之一是结合sudo将输出重定向到 root 拥有的文件:

$ somecommand | sudo tee /root/somefile >/dev/null

以下将不是自从重定向以非特权用户身份发生以来一直有效(它也将以somecommandroot 身份运行,这可能是不需要的):

$ sudo somecommand >/root/somefile

一次将一组固定行附加到许多文件的人为示例(附加到所有用户~/.profile文件,假设*扩展为用户名并且扩展的命令行不会变得太长而导致 shell 无法处理):

$ tee -a /home/*/.profile <<'END_NEWPATH'
PATH="$PATH:/opt/bin"
END_NEWPATH

使用的真实示例tee

time doas box-build.sh 2>&1 | tee build.out |  grep '^=*>'

这是我构建的 OpenBSD 基础系统。doasOpenBSD“等效”的sudobox-build.sh一个小的 shell 脚本,用于构建(本质上cd /usr/src && make obj && make build)。我想存储整个构建过程的输出,包括任何错误或警告,但我不想让所有内容都涌入我的终端。为此,我使用tee将所有内容保存到build.out然后grep仅获取我们在终端中的进程中的位置的提示。

另请参阅此处标记为的其他问题标签。

相关内容