如何在将屏幕保持在屏幕上的同时管道? (而不是输出文件)

时间:2011-04-15 13:05:37

标签: bash shell pipe output stdout

我希望管理程序的标准输出,同时将其保留在屏幕上。

使用一个简单的例子(这里使用的echo仅用于说明目的):

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

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

我试过了 $ echo 'ee' | tee /dev/stdout | foo,但由于将/dev/stdout的T形输出设为foo

,因此无效

5 个答案:

答案 0 :(得分:278)

这是一个适用于任何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程序很有用   无论如何,将信息写入或从终端读取数据   输出已重定向。它也可用于那些应用程序   当需要输入输出时,需要输出文件的名称   找出目前正在使用的终端是很烦人的。在每个过程中,控制终端的同义词

据报告,Google Colab等某些环境在/dev/tty命令返回可用设备时仍未实施tty=$(tty) echo 'ee' | tee $tty | foo 。这是一个解决方法:

tty=`tty`
echo 'ee' | tee $tty | foo

或者使用古老的Bourne shell:

{{1}}

答案 1 :(得分:58)

要尝试的另一件事是:

echo 'ee' | tee >(foo)

>(foo)process substitution

答案 2 :(得分:16)

访问&#34; / dev / stdout&#34;在某些系统上被拒绝,但用户终端的访问权限由&#34; / dev / tty&#34;给出。 使用&#34; wc&#34;对于&#34; foo&#34;,上面的例子可以正常工作(在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


  

POSTSCRIPT:对于年轻人来说,谁可能会发音为#34; titty&#34;,我可能会添加&#34; tty&#34;曾经是常见的   a&#34; teletype&#34;的缩写终端,使用了一卷黄色   纸张和圆形钥匙经常卡住。

答案 3 :(得分:15)

尝试:

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

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

答案 4 :(得分:8)

首先你需要找出与你的屏幕相关的终端(或者你希望输出显示的屏幕):

tty

然后你可以将输出发送到那个终端并通过你的foo程序管道另一个副本:

echo ee | tee /dev/pty/2 | foo
相关问题