同时保持它在屏幕上如何管标准输出? (而不是一个输出文件)

问题描述 投票:191回答:5

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

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

$ echo 'ee' | foo ee

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

我试过了 $ echo 'ee' | tee /dev/stdout | foo但因为发球输出不工作,/dev/stdout通过管道输送到foo

bash shell pipe output stdout
5个回答
300
投票

这里是一个在任何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

60
投票

试试另一件事情是:

echo 'ee' | tee >(foo)

>(foo)process substitution


18
投票

到“的/ 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”曾经是一个“电传”终端,它使用黄色纸一卷的常用缩写和有轮密钥经常卡住。


15
投票

尝试:

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

如果使用标准错误是一个选项,当然。


8
投票

首先你要弄清楚你的屏幕(或任何屏幕上你想要的输出上显示)相关联的终端:

tty

那么你可以通过你的FOO程序发球输出到终端和管道其他副本:

echo ee | tee /dev/pty/2 | foo
© www.soinside.com 2019 - 2024. All rights reserved.