在
Bash中创建一个非线性管道是最干净(最简单,最有效,最短,最快,最简单,最优雅)的方法.
@H_301_1@我有三个命令:mksock,irclogin和ircpingpong.我想把stdin,irclogin和ircpingpong管理成mksock,把mksock管道输入stdout和ircpingpong.这意味着mksock和ircpingpong是循环的.我画了一张图.
@H_301_1@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@H_301_1@这是有效的,但我想知道是否有更好的方式来做到这一点.令我烦恼的是,我使用一个文件而不是一个管道,从ircpingpong回到mksock使用尾巴.使用管道不起作用,因为我的理解是,在tail -f开始读取之前,有些东西被写入管道,所以它错过了.它也让我感到,我必须在脚本的末尾杀死尾巴,因为它不会停止在自己的脚本上,并且即使在脚本结束后也会保持插座连接.
我可以建议一个没有临时文件的版本,并有两个fifo:
原文链接:https://www.f2er.com/bash/385965.htmlfifo1=/tmp/fifo1 fifo2=/tmp/fifo2 rm $fifo1 rm $fifo2 mkfifo $fifo1 mkfifo $fifo2 ircpingpong < $fifo1 > $fifo2 & (mksock <$fifo2|tee $fifo1 )& irclogin >$fifo2 & cat >$fifo2@H_301_1@这个想法是分别运行所有程序,只能确保每个程序的输入和输出都按照这个图适当地被重定向: @H_301_1@ @H_301_1@当然,ircpingpong必须读取stdin并写入stdout,irclogin必须写入stdout,并且mksock必须从stdin读取并写入stdout.