使用 tee 将中间结果输出到 stdout 而不是文件

使用 tee 将中间结果输出到 stdout 而不是文件

我知道为了在处理的中间阶段捕获管道的内容,我们使用 tee as ls /bin /usr/bin | sort | uniq | tee abc.txt | grep out,但是如果我不想重定向管道怎么办?uniq后的内容为abc.txt 向屏幕(当然,通过标准输出)因此作为最终结果,我将在屏幕上显示 uniq 之后的中间内容以及 grep 之后的内容。

答案1

有时 /dev/tty 可以用于此...

ls /bin /usr/bin | sort | uniq | tee /dev/tty | grep out | wc

答案2

ls /bin /usr/bin | sort | uniq | tee /dev/fd/2 | grep out | wc

在 Linux 系统上,/dev/fd/[num]很多情况下您可以使用命名管道等链接。这会将 stdout 复制到 stderr,通常是您的终端屏幕,但并不需要如此。

答案3

如何做(示例):

exec 3>&1; ( ls |( tee >&3 ) >/dev/null ); exec 3>&-

这将显示 ls 结果将其送往涅槃。

要理解关键部分,3>&1您可以阅读输入/输出重定向尤其是。这例子

简而言之:>somefile是 的缩写1>somefile,这又意味着将 somefile 的文件句柄分配给文件描述符 1(并删除该描述符的前一个值,用于此进程的范围)

所以,3>&1意思是:将文件描述符 1(可以但不一定是 tty)分配给(直到现在未使用的)文件描述符 3。我们有效地用作&3临时变量。

答案4

这个命令对我有用。

ls /bin /usr/bin | sort | uniq | tee /dev/pts/0 | grep out

您可以使用该命令检查您的终端是什么,tty并替换 tee 以将输出重定向到该终端。

参考

https://stackoverflow.com/a/18025293/1742825

相关内容