在Bash中创建非线性管道的最干净的方法是什么?

前端之家收集整理的这篇文章主要介绍了在Bash中创建非线性管道的最干净的方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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:
fifo1=/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.

原文链接:https://www.f2er.com/bash/385965.html

猜你在找的Bash相关文章