Bash - Usa a criação automática de descritores de arquivos em vez de fifo

4

No começo, criei um pequeno servidor com netcat e funcionou bem:

#!/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;

Ele usa fifos para redirecionar a saída do loop principal de volta para netcat .

Cada chamada para startServer aumenta o valor de $1 e cria um arquivo fifo fifo/$1 .

Mas eu quero usar a criação do descritor de arquivos automático do bash para me livrar de fifo files e o parâmetro de startServer .

Após várias tentativas, aqui está minha tentativa atual de modificar a função startServer . Eu posso receber linhas do cliente, mas infelizmente ele não recebe nada de volta. Estou confuso sobre o que está errado.

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}>&-;
}

Além disso, não posso usar a opção "-e" do netcat, pois ela não está disponível no pacote netcat-openbsd.

    
por nd97 18.11.2017 / 15:21

1 resposta

3

Você não pode definir e usar fd no mesmo comando; você está efetivamente fazendo exec {fd}> ... >&$fd . O que pode funcionar é criar primeiro o fifo / pipe bash, usando algum comando simples como : . Por exemplo:

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}<&-
}
    
por 18.11.2017 / 20:49