在 Bash 中创建这样的非线性管道的最干净(最简单、最有效、最短、最快、最简单、最优雅)的方法是什么?
我有三个命令:mksock
、irclogin
和ircpingpong
。我想通过管道将stdin
,irclogin
和ircpingpong
输入mksock
, 并通过管道mksock
输入stdout
and ircpingpong
。这意味着mksock
andircpingpong
处于一个循环中。我画了一张图:
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
这行得通,但我想知道是否有更好的方法来做到这一点。困扰我的是,我使用的是文件而不是管道来使用 tail从ircpingpong循环回到mksock 。使用管道不起作用,因为据我了解,在tail -f
开始读取管道之前已将某些内容写入管道,因此它错过了它。
我必须在脚本末尾杀死 tail 也让我感到困扰,因为它不会自行停止,即使在脚本结束后也会保持套接字连接。