代码之家  ›  专栏  ›  技术社区  ›  Ritwik Bose

管道bash输出到两个不同的流

  •  2
  • Ritwik Bose  · 技术社区  · 15 年前

    2 回复  |  直到 15 年前
        1
  •  6
  •   Tim Yates    15 年前

    看这张照片 tee 效用( man tee ).

        2
  •  4
  •   NerdMachine    11 年前

    这个 tee

    echo input | 
      while read foo; do
        echo "$foo"
        echo "$foo" >&2
      done 2> >( command1 1>&2 ) | command2
    

    下面是一个演示,其中字符串“input”前面加上一个数字,以显示输出的去向,然后作为输入发送到两个只在流名称前面加上前缀的perl程序。

    echo input | 
      while read foo; do
        echo "1: $foo"
        echo "2: $foo" >&2
      done 2> >( perl -wpe 's//STDERR: /;' 1>&2) | perl -wpe 's//STDOUT: /;'
    

    STDERR: 2: input
    STDOUT: 1: input
    

    警告-while/read/echo可能不会保留行尾和二进制文本,长行将导致问题。与许多事情一样,bash可能不是最好的解决方案。下面是一个perl解决方案,它可以解决任何问题,但不能解决非常大的文件:

    echo input | 
      perl -wne 'print STDERR; print;' 2> >( command1 >&2) | command2
    
    推荐文章