我想一个程序的管道标准输出,同时保持它在屏幕上。
一个简单的例子(echo
这里用的是只是为了说明用途):
$ echo 'ee' | foo
ee
我知道,三通可以复制标准输出到文件,但是这不是我想要的。
$ echo 'ee' | tee output.txt | foo
我试过了
$ echo 'ee' | tee /dev/stdout | foo
但因为发球输出不工作,/dev/stdout
通过管道输送到foo
这里是一个在任何Unix / Linux上执行工作,假设它关心遵循POSIX
标准的解决方案。它适用于一些非Unix环境像cygwin
了。
echo 'ee' | tee /dev/tty | foo
参考:The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, §10.1:
的/ dev / tty的
有关与过程组的过程中,如果有的话。这对于希望确保消息写入或从终端读取数据,无论输出是如何被重定向的程序或shell程序非常有用。它也可以用于输入输出需要时要求输出,文件名的应用程序和它是烦人找出终端正在使用什么。在每一个过程中,对于控制终端的同义词
像谷歌Colab某些环境已报告不同时还具有其/dev/tty
命令返回一个可用的设备实现tty
。这里是一个解决办法:
tty=$(tty)
echo 'ee' | tee $tty | foo
或用古老的Bourne shell:
tty=`tty`
echo 'ee' | tee $tty | foo
到“的/ dev /标准输出”访问被拒绝在某些系统上,但获得了用户终端通过“的/ dev / tty的”给定。使用“WC”的“富”,上面的例子中工作确定(在Linux,OSX等):
% echo 'Hi' | tee /dev/tty | wc Hi 1 1 3
要在符合条件的文件列表的底部增加一个数,我用的是这样的:
% ls [A-J]* | tee /dev/tty | wc -l
为了避免记住这一切,我定义别名:
% alias t tee /dev/tty
% alias wcl wc -l
这样我可以简单地说:
% ls [A-J]* | t | wcl
后记:对于年轻的设定,谁可能在它的发音为“奶”偷笑,我想补充一点“TTY”曾经是一个“电传”终端,它使用黄色纸一卷的常用缩写和有轮密钥经常卡住。
尝试:
$ echo 'ee' | tee /dev/stderr | foo
如果使用标准错误是一个选项,当然。
首先你要弄清楚你的屏幕(或任何屏幕上你想要的输出上显示)相关联的终端:
tty
那么你可以通过你的FOO程序发球输出到终端和管道其他副本:
echo ee | tee /dev/pty/2 | foo