BASH: Ler linhas da conexão netcat

1

Eu tenho um script simples que lê algumas linhas de uma conexão inicializada usando o netcat. Um cliente pode transmitir alguns "comandos". Se o cliente escrever "sair" eu gosto de fechar a conexão.

MAS: Depois de transmitir a "saída", o script ecoa a "Saída" recebida "mas ainda lê uma mais linha antes que o" Adeus "apareça.

echo "Start listening on port $PORT ..."
    (echo "Welcome. Please give me one of the following commands: 
            $AVAILABLECOMMANDS") | nc -q -1 -l $PORT | while read line
    do
            if [ "$line" == 'exit' ]; then
                    echo "Received 'exit'"
                    break
            else
                    result=$(executeCommand $line)
                    echo "$result"
            fi
    done
    echo "Good bye"

Acho que tenho que reescrever o loop, mas não tenho ideia de como.

Alguém pode ajudar?

Obrigado.

    
por ErWu 19.01.2017 / 15:01

1 resposta

1

Como explicado aqui , o bash fez a opção de sair apenas quando todos os comandos no pipe terminaram. Aqui, netcat não deseja parar, mas depois que o pipe final for quebrado, netcat falhará. É por isso que você precisa esperar mais uma vez para sair do loop (a propósito, você tem um erro quando sai do loop). Aqui está uma versão que não tem esse problema de pipe:

#!/bin/bash

echo "Start listening on port 12345 ..."
while read line
do
    if [ "$line" == 'exit' ]; then
        echo "Received 'exit'"
        break
    else
        echo "$line"
    fi
done < <((echo "Welcome. Please give me one of the following commands: $AVAILABLECOMMANDS") | nc -q -1 -l 12345)
echo "Good bye"
    
por tobiasBora 19.01.2017 / 15:17