V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
SoloCompany
V2EX  ›  Bash

问个 `tee` 以及 `/dev/console` 的问题

  •  1
     
  •   SoloCompany · 2016-06-24 23:09:19 +08:00 · 2587 次点击
    这是一个创建于 3071 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不想遛狗或者 SO 了,当一回伸手党吧

    原来是希望能让一个输出两次, tee 比较适合做这个 比如

    echo 1 | tee /dev/stdout
    1
    1
    

    然后希望能够 pipe 下去,初看很美好

    echo 1 | tee /dev/stdout | cat
    1
    1
    

    但后来发现,实际被 pipeline 的不是一个输出,而是两个输出同时被 pipline ,比如

    echo 1 | tee /dev/stdout | tr 1 2
    2
    2
    

    我希望能输出 1 和 2

    然后我试了下用 /dev/console,结果失败了

    echo 1 > /dev/console
    Σ<(っ =°Д °)っ 啥也没输出
    

    看来是没戏了

    谁能告诉我 /dev/console 或者 tee 的正确使用姿势? 或者这类需求有什么其它更好的简单解决方案

    11 条回复    2016-06-25 10:41:07 +08:00
    fcicq
        1
    fcicq  
       2016-06-24 23:13:27 +08:00
    第一问 sed 'p' 或者 sed -n 'p;p'
    后面 tr 肯定也能用 sed 实现.
    SoloCompany
        2
    SoloCompany  
    OP
       2016-06-24 23:15:32 +08:00
    @fcicq 我知道 sed 可以实现啊,但我只是举个栗子,我真是的需求是希望 pipeline 中途可以旁路输出内容(但不是写到文件里面,我知道 tee 可以干这个),然后同时继续后面的 pipeline
    jybox
        3
    jybox  
       2016-06-24 23:16:15 +08:00
    /dev/stdout 是对于「当前程序」而言的(而不是当前 Shell ),在你的第三段代码里,是 tee 在往 stdout 写数据,所以数据是被写到 tee 的标准输出的,所以会被 pipe 到 tr.
    fcicq
        4
    fcicq  
       2016-06-24 23:16:27 +08:00
    @SoloCompany 那可能只能 mkfifo 然后组装了.
    SoloCompany
        5
    SoloCompany  
    OP
       2016-06-24 23:18:55 +08:00
    @fcicq 就是觉得很复杂想看看有没有简单解决方案,因为 tee 写到临时文件也是可以解决的,而且应该比 mkfifo 要简单一些
    SoloCompany
        6
    SoloCompany  
    OP
       2016-06-24 23:21:59 +08:00
    可能我这个本身就是不合理需求吧
    pipeline 旁路应该是不能使用同一个管道的
    即使可以的话,多个管道进程输出可能也会导致输出的内容发生交叉
    也许只能有临时文件一种途径了
    billlee
        7
    billlee  
       2016-06-24 23:36:07 +08:00   ❤️ 1
    Process Substitution:
    echo 1 | tee >(tr 1 2)
    SoloCompany
        8
    SoloCompany  
    OP
       2016-06-24 23:39:04 +08:00
    @billlee 蟹蟹!!
    rrfeng
        9
    rrfeng  
       2016-06-25 01:50:12 +08:00
    💀
    $ echo 1 | tee /dev/stderr | tr 1 2
    1
    2
    rrfeng
        10
    rrfeng  
       2016-06-25 01:51:57 +08:00
    $ echo 1 | tee /dev/stderr | tr 1 2 2>&1
    SoloCompany
        11
    SoloCompany  
    OP
       2016-06-25 10:41:07 +08:00 via iPhone
    @rrfeng 你这是取巧,而且 pipeline 不能继续往下传递了,前面的答案才是正解,不过还是蟹蟹
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3114 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 12:38 · PVG 20:38 · LAX 04:38 · JFK 07:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.