代码之家  ›  专栏  ›  技术社区  ›  User1

如何使用三通接头而不是命名管道

  •  6
  • User1  · 技术社区  · 15 年前

    我想把stdout从一个进程中去掉,用三个不同的程序分析它。我可以使用命名管道,但我可以使用fd。

    以下是目前有效的方法:

    
    exec 3< <(myprog)
    tee p1 p2 >/dev/null <&3
    
    cat p1|ap1 &
    cat p2|ap2 &
    
    

    p1和p2是用mkfifo创建的。AP1和AP2是分析程序。我不知道我说得对不对,但有没有办法 tee 换成两个新的FD?像这样:

    
    exec 3< <(myprog)
    tee >&4 >&5 <&3
    
    cat <&4|ap1 &
    cat <&5|ap2 &
    
    
    1 回复  |  直到 15 年前
        1
  •  5
  •   Brian Campbell Dennis Williamson    15 年前

    你几乎得到了它:

    myprog | tee >(ap1) >(ap2) >(ap3) >/dev/null
    

    注意 ap1 可以是函数。如果希望函数可以访问脚本的参数,请使用 "$@" ,即

    ap1 () {
      # here the script arguments are available as $1, $2, ...
    }
    # ditto for ap2, ap3
    myprog | tee >(ap1 "$@") >(ap2 "$@") >(ap3 "$@") >/dev/null
    

    如果你的外壳不支持 >() (bash、ksh和zsh支持,但它不是posix),但是您的操作系统仍然支持 /dev/fd (大多数unice都可以,包括solaris、linux、*bsd、osx和cygwin),您可以使用显式的fd shuffling。

    { { { myprog | tee /dev/fd/3 /dev/fd/4 |
          ap1 >&2
        } 3>&1 |
        ap2 >&2
      } 4>&1 |
      ap3 >&2
    }
    
    推荐文章