Bash - fifoの代わりに自動ファイル記述子生成を使用します。

Bash - fifoの代わりに自動ファイル記述子生成を使用します。

開始するには、小さなサーバーを作成し、うまくいったnetcat

#!/bin/bash

PORT="1234";

startServer(){
    fifo="fifo/$1";
    mkfifo "$fifo";

    connected="0";

    netcat -q 0 -l -p "$PORT" < "$fifo" | while read -r line; do
        if [ "$connected" == "0" ];then
            #listen for a new connection
            startServer $(($1+1))&
            connected="1";
        fi

        #server logic goes here

    done > "$fifo";

    rm "$fifo";
}

mkdir fifo;
startServer 0;

fifosを使用してメインループ出力を再びnetcat

呼び出すたびにstartServer値が増加し、$1fifoファイルが生成されますfifo/$1

しかし、私は使いたいBash は自動的にファイル記述子を生成します。ファイルfifostartServer

多くの試みの終わりに、これは現在のstartServer機能を修正しようとする試みです。お客様から回線を受けることができますが、残念ながら何の回答も受けられません。何が起こっているのか混乱しています。

startServer(){
    connected="0";

    #create file descriptor and read output from main loop
    exec {fd}> >( netcat -q 0 -l -p "$PORT" | while read -r line; do
        if [ "$connected" == "0" ];then
            #listen for a new connection
            startServer&
            connected="1";
        fi

        #server logic goes here

    done ) >&$fd;

    #close file descriptor
    exec {fd}<&-;
    exec {fd}>&-;
}

また、netcat-openbsdパッケージでは使用できないため、netcatの "-e"オプションは使用できません。

答え1

fd実際に実行しているのと同じコマンドで設定して使用することはできませんexec {fd}> ... >&$fd。どのように機能するかは、まず次のような簡単なコマンドを使用することです:

startServer(){
    local connected=0 fd
    exec {fd}<> <(:)
    nc -q 0 -l -p "$PORT" <&$fd | 
    while read -r line
    do  if [ "$connected" == "0" ]
        then startServer $(($1+1)) &
             connected="1"
        fi
        echo server $1 logic goes here
    done >&$fd
    exec {fd}<&-
}

関連情報