我希望管理程序的标准输出,同时将其保留在屏幕上。
使用一个简单的例子(这里使用的echo
仅用于说明目的):
$ echo 'ee' | foo
ee
< - 我希望看到的输出
我知道tee可以将stdout复制到文件中,但这不是我想要的
$ echo 'ee' | tee output.txt | foo
我试过了
$ echo 'ee' | tee /dev/stdout | foo
,但由于将/dev/stdout
的T形输出设为foo
答案 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)
答案 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