如何在保持屏幕的同时pipe理标准输出? (而不是输出文件)

我想在一个程序的标准输出的同时保持在屏幕上。

用一个简单的例子(这里使用echo只是为了说明的目的):

$ echo 'ee' | foo
ee < – 我希望看到的输出

我知道三通可以复制stdout文件,但这不是我想要的。
$ echo 'ee' | tee output.txt | foo

我试过了
$ echo 'ee' | tee /dev/stdout | foo 但是它不起作用,因为tee输出到/dev/stdout被传送到foo

这是一个解决scheme,可以在任何Unix / Linux实现上工作,假设它关心遵循POSIX标准。 它也适用于像cygwin这样的非Unix环境。

 echo 'ee' | tee /dev/tty | foo 

参考文献: Open Group Base Specifications第7期IEEE Std 1003.1,2013 Edition§10.1 :

的/ dev / tty的

与该进程的进程组关联,如果有的话。 对于希望确保 向terminal 写入消息或从terminal读取数据的程序或shell程序, 无论输出如何redirect 都是有用的 它还可以用于要求输出文件名称的应用程序,当需要input输出时,并且找出当前正在使用哪个terminal是令人厌烦的。 在每个过程中,控制terminal的同义词

另一件尝试是:

 echo 'ee' | tee >(foo) 

>(foo)是一个进程replace 。

尝试:

 $ echo 'ee' | tee /dev/stderr | foo 

当然,如果使用stderr是一个选项。

在某些系统上,对“/ dev / stdout”的访问被拒绝,但是对用户terminal的访问由“/ dev / tty”给出。 使用“wc”作为“foo”,上面的例子可以正常工作(在linux,OSX等):

% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3

要在匹配文件列表的底部添加一个计数,我使用如下所示:
% ls [AJ]* | tee /dev/tty | wc -l

为了避免必须记住所有这些,我定义了别名:
% alias t tee /dev/tty
% alias wcl wc -l

这样我可以简单地说:
% ls [AJ]* | t | wcl


POSTSCRIPT:对于那些可能在发音上滴答滴答的年轻人,我可能会补充说“tty”曾经是“电传”terminal的常用缩写,它使用了一卷黄纸,并且经常有圆键卡住。

首先你需要弄清楚与你的屏幕相关的terminal(或者你希望输出显示在哪个屏幕上):

 tty 

那么你可以将输出发送到该terminal,并通过你的foo程序pipe道另一个副本:

 echo ee | tee /dev/pty/2 | foo