什么是在Bash中创建非线性管道的最简洁,最简单,最高效,最短,最快,最简单,最优雅的方法?在Bash中创建非线性管道的最简洁方法是什么?
我有三个命令:mksock,irclogin和ircpingpong。我想管标准输入,irclogin和ircpingpong到mksock和管道mksock到标准输出和ircpingpong。这意味着mksock和ircpingpong处于循环状态。我画了一张图。
irclogin只需要被运行一次,并成为第一输入到mksock。之后,ircpingpong和stdin应随时接受。我目前使用的管道和临时文件是这样的:
#!/bin/bash
server=127.0.0.1
port=6667
infifo=/tmp/ircin
outfifo=/tmp/ircout
pongfifo=/tmp/ircpong
rm $infifo
rm $outfifo
rm $pongfifo
mkfifo $infifo
mkfifo $outfifo
touch $pongfifo
(irclogin | cat - $infifo & tail -f $pongfifo;) | mksock $server $port | tee $outfifo | stdbuf -oL ircpingpong > $pongfifo &
cat < $outfifo &
cat > $infifo
pkill tail
这工作,但我想知道是否有更好的方法来做到这一点。它困扰我,我正在使用一个文件,而不是一个管道从循环回ircpingpong到mksock使用尾巴。因为根据我的理解,在tail -f开始读取之前,管道上会写入一些东西,所以它错过了。同样困扰我的是,我必须在脚本结尾处杀死尾部,因为它并不会自行停止,并且即使在脚本结束后也会使套接字连接。
这是Coproceses的用途。它们在Korn shell和bash上的支持不同,bash协处理器在bash 4.0中引入。请参阅http://wiki.bash-hackers.org/syntax/keywords/coproc – cdarke