在管道命令中使用 tee 时出现奇怪的输出

在管道命令中使用 tee 时出现奇怪的输出

我必须在作业中使用以下命令:

who|tee test|wc -l

我的系统上的输出如下,这意味着 2 个用户已连接:

2

为什么我who在屏幕上没有得到 的输出,然后就没有得到 的输出wc -l?我认为tee将输出写入屏幕并同时创建一个具有相同输出的文件?

who然而,在我的文件中找到了输出“测试”,但对我来说仍然没有意义。

答案1

管道到的效果tee是,无论您的第一个命令写入其标准输出写入文件(其名称作为命令行参数传递给tee)以及写入tee命令的标准输出。如果管道不继续并且您没有对命令执行任何重定向tee,则tee的标准输出是 shell(通常是终端)的标准输出。

这就是为什么 runningwho和 runningwho | tee test在终端上显示相同的文本。与你的区别tee还在于将其写入文件。

如果管道继续,就像 一样who | tee test | wc -l,那么任何写入终端的标准输出都会被发送到管道中的下一个命令。这是wc命令,与 不同的是teewc它不会将其输入复制到标准输出(或任何地方)。相反,它显示统计数据。使用该-l选项,它仅显示行数,所以这就是您所看到的全部。

2因此,您仅从看到的原因与您仅从who | tee test | wc -l看到的原因相同。该命令将 的输出写入文件,但不会将其打印到终端,除非2who | wc -lteewho它是标准输出是终端。默认情况下通常是这样,但当您通过管道将其传递给另一个命令时则不是。

如果您在 a 的左侧看到一个命令,|其输出显示在终端上,而不是用作管道中下一个命令的输入,那么它可能正在写入标准误而不是标准输出。

答案2

tee复制输入,以便它进入文件并标准输出。从那里标准输出被输送到wc...它变成标准输入为了wcwc仅返回计数,其计数的输入数据不会被回显。

如果您想理解它,您可以认为cmd1 | tee file | cmd2具有与此相同的效果:

cmd1 > file
cat file | cmd2

这不是什么实际上会发生,但从执行命令的人的角度来看,它们看起来是相同的(只要cmd1速度足够快,给人留下所有事情几乎同时发生的印象)。实际上是在接收数据的file同时填充数据。cmd2

答案3

想要同时看到两个who wcdo中的输出bash

who | tee >(wc -l) test

输出:

me       tty7         2017-10-16 18:17 (:0)
1

随着内容测试

相关内容