我想采用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 &
你几乎拥有它:
myprog | tee >(ap1) >(ap2) >(ap3) >/dev/null
Run Code Online (Sandbox Code Playgroud)
注意,这ap1
可以是一个功能.如果您希望函数能够访问脚本的参数,请调用它"$@"
,即,
ap1 () {
# here the script arguments are available as $1, $2, ...
}
# ditto for ap2, ap3
myprog | tee >(ap1 "$@") >(ap2 "$@") >(ap3 "$@") >/dev/null
Run Code Online (Sandbox Code Playgroud)
如果你的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
}
Run Code Online (Sandbox Code Playgroud)