加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:40:20 所属栏目:安全 来源:网络整理
导读:在 Bash中创建一个非线性管道是最干净(最简单,最有效,最短,最快,最简单,最优雅)的方法. 我有三个命令:mksock,irclogin和ircpingpong.我想把stdin,irclogin和ircpingpong管理成mksock,把mksock管道输入stdout和ircpingpong.这意味着mksock和ircpingpong是循
在 Bash中创建一个非线性管道是最干净(最简单,最有效,最短,最快,最简单,最优雅)的方法.

我有三个命令:mksock,irclogin和ircpingpong.我想把stdin,irclogin和ircpingpong管理成mksock,把mksock管道输入stdout和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开始读取之前,有些东西被写入管道,所以它错过了.它也让我感到,我必须在脚本的末尾杀死尾巴,因为它不会停止在自己的脚本上,并且即使在脚本结束后也会保持插座连接.

我可以建议一个没有临时文件的版本,并有两个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

这个想法是分别运行所有程序,只能确保每个程序的输入和输出都按照这个图适当地被重定向:

当然,ircpingpong必须读取stdin并写入stdout,irclogin必须写入stdout,并且mksock必须从stdin读取并写入stdout.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读