首页 文章

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

提问于
浏览
169

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

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

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

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

我试过了
$ echo 'ee' | tee /dev/stdout | foo 但它不起作用,因为tee输出到 /dev/stdout 被传送到 foo

5 回答

  • 246

    另一件要尝试的是:

    echo 'ee' | tee >(foo)
    

    >(foo)process substitution .

  • 7

    尝试:

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

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

  • 16

    在某些系统上拒绝访问“/ dev / stdout”,但是“/ dev / tty”给出了对用户终端的访问权限 . 使用“wc”表示“foo”,上面的例子可以正常工作(在linux,OSX等上):

    %echo'嗨'| tee / dev / tty | wc嗨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”曾经是“电传打字”终端的常用缩写,它使用了一卷黄纸并且有圆形键,经常卡住 .

  • 15

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

    tty
    

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

    echo ee | tee /dev/pty/2 | foo
    
  • 54

    这是一个适用于任何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程序,无论输出如何被重定向,它都是有用的 . 它还可以用于需要输出文件名称的应用程序,当需要输入类型时,找出当前正在使用的终端是很烦人的 . 在每个过程中,控制终端的同义词

相关问题