如何进入fd而不是命名管道

时间:2010-08-26 18:17:31

标签: bash pipe

我想采用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 个答案:

答案 0 :(得分:5)

你几乎拥有它:

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

如果你的shell不支持>()(bash,ksh和zsh,但它不是POSIX),但你的操作系统仍然支持/dev/fd(大多数unices都支持,包括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
}
相关问题