gpt4 book ai didi

bash - 创建非线性管道的最干净的方法是什么?

转载 作者:行者123 更新时间:2023-11-29 08:48:33 25 4
gpt4 key购买 nike

在 Bash 中创建像这样的非线性管道的最干净(最简单、最有效、最短、最快速、最简单、最优雅)的方法是什么?

我有三个命令:mksockircloginircpingpong。我想将 stdinircloginircpingpong 通过管道传输到 mksock 中,然后通过管道传输 mksock 进入 stdoutircpingpong。这意味着 mksockircpingpong 处于循环中。我画了一个图:

Diagram

irclogin 只需运行一次,并且是 mksock 的第一个输入。之后,ircpingpongstdin 应该随时被接受。我目前正在使用管道和这样的临时文件:

#!/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 开始从管道读取之前,有些东西被写入了管道,所以它错过了它。

令我困扰的是,我必须在脚本末尾终止 tail,因为它不会自行停止,即使在脚本结束后仍会保持套接字连接。

最佳答案

我可以推荐一个没有临时文件的版本,有两个 fifo-s:

fifo1=/tmp/fifo1
fifo2=/tmp/fifo2
rm $fifo1
rm $fifo2
mkfifo $fifo1
mkfifo $fifo2

ircpingpong < $fifo2 > $fifo1 &
(mksock <$fifo1|tee $fifo2 )&
irclogin >$fifo1 &
cat >$fifo1

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

pipe-flow

当然,ircpingpong必须读取stdin并写入stdoutirclogin必须写入 stdoutmksock 必须从 stdin 读取并写入 stdout

关于bash - 创建非线性管道的最干净的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35820825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com