如何在保持屏幕的同时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