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

gen*_*too 214 bash shell stdout pipe output

我想在保持屏幕的同时管道程序的标准输出.

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

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

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

我试过
$ echo 'ee' | tee /dev/stdout | foo但是因为tee输出到了/dev/stdout管道,所以它不起作用foo

jll*_*gre 315

这是一个适用于任何Unix/Linux实现的解决方案,假设它关注POSIX标准.它也适用于某些非Unix环境cygwin.

echo 'ee' | tee /dev/tty | foo
Run Code Online (Sandbox Code Playgroud)

参考: Open Group Base规范第7期IEEE Std 1003.1,2013 Edition,§10.1:

的/ dev/tty的

与该流程的流程组相关联,如果有的话.无论输出如何被重定向,它对于希望确保向终端写入消息或从终端读取数据的程序或shell过程都很有用.它还可以用于需要输出文件名称的应用程序,当需要输入类型时,找到当前正在使用的终端是很烦人的.在每个过程中,控制终端的同义词

据报道,Google Colab等一些环境在执行命令返回可用设备/dev/tty时仍未实施tty.这是一个解决方法:

tty=$(tty)
echo 'ee' | tee $tty | foo
Run Code Online (Sandbox Code Playgroud)

或者使用古老的Bourne shell:

tty=`tty`
echo 'ee' | tee $tty | foo
Run Code Online (Sandbox Code Playgroud)

  • @static_rtti为什么你年复一年地忽略了我对你评论的回复? (5认同)

bmk*_*bmk 61

另一件要尝试的是:

echo 'ee' | tee >(foo)
Run Code Online (Sandbox Code Playgroud)

>(foo)是一个过程替代.

  • @Nick Chammas,为了保持正常的管道,你可以交换tee的输出:`echo'ee'| tee>(cat)| foo | bar`. (6认同)
  • @JackTang - 我认为`foo`输出上的任何进一步管道必须是进程替换的一部分.这是一个例子:`echo'ee'| tee file.txt>(wc -c | tr -d'')` (2认同)
  • @Vaelus 对我来说,“foo”看到的是“ee”的两倍,但终端上没有打印任何内容。尝试`echo 'ee' | T 恤 &gt;(猫) | grep .` 与 `echo 'ee' | T 恤 &gt;(猫) | grep x`。 (2认同)

小智 18

在某些系统上拒绝访问"/ dev/stdout",但是"/ dev/tty"给出了对用户终端的访问权限.使用"wc"表示"foo",上面的例子可以正常工作(在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:对于年轻人,可能会发音为"titty",我可能会补充一点,"tty"曾经是"电传打字"终端的常用缩写,它使用了一卷黄纸并且经常使用圆形键卡住.


Jan*_*Jan 15

尝试:

$ echo 'ee' | tee /dev/stderr | foo
Run Code Online (Sandbox Code Playgroud)

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


Mic*_*nez 8

首先,您需要弄清楚与您的屏幕相关联的终端(或您希望输出显示在哪个屏幕上):

tty
Run Code Online (Sandbox Code Playgroud)

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

echo ee | tee /dev/pty/2 | foo
Run Code Online (Sandbox Code Playgroud)

  • @JackTang那确实比较好但是`t`没用.你可以使用`echo ee | tee $(tty)| foo`但它仍然有一个无用的命令(`tty`),因为`/ dev/tty`正常工作. (5认同)
  • oneliner: t=$(tty) echo ee | t 恤 $t | 富| 酒吧 (2认同)