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값이 증가 $1하고 fifo 파일이 생성됩니다 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}<&-
}

관련 정보