Bash Pipeline para de trabalhar

0

Estou escrevendo um script para processar a saída de uma chamada mosquitto_sub:

function testPipe(){
 read foo
 IFS=' ' read -ra ARRAY <<< "$foo"
 topic=${ARRAY[0]}
 cmd=${ARRAY[1]}
 echo "topic = $topic cmd = $cmd"
 cat
}

function pipeTee(){
 tee -a mqtt_broker.log
}

mosquitto_sub -h $HOST -p $PORT -t $TOPIC \
      -u $USER -P $PASS -v | pipeTee | testPipe

Eu tentei seguir em frente de Saída do pipe demon para uma função . No entanto, aqui está o que eu observei, a primeira mensagem chega através do fio e a função testPipe é chamada e eu vejo a linha analisada. Todas as mensagens subseqüentes são impressas no console bruto, ou seja, quando chegam da rede.

O que eu posso estar fazendo errado? O "read foo" não consome a entrada em STDIN?

    
por Greg S 15.04.2018 / 06:49

1 resposta

0

Se você iniciar o broker (com mosquitto ), inscreva-se em um tópico my/test com

mosquitto_sub -t my/test -v

você pode publicar mensagens simples e ver o que receberá. Por exemplo,

mosquitto_pub -t my/test -m inline

aparecerá na saída da assinatura como uma única linha

my/test inline

Se todas as suas mensagens forem desse tipo, você deve simplesmente fazer um loop para chamar sua função:

... | pipeTee | while testPipe; do : ; done

mas sua função não pode usar cat ou nunca retornará. Se você quiser enviar mensagens de múltiplas linhas, você precisará substituir o cat por uma leitura dentro de outro, enquanto o loop detectar de alguma forma o final da mensagem. Por exemplo, se você publicar com

echo -e 'my multi\nline test' | mosquitto_pub -t my/test -s

você verá três linhas:

my/test my multi
line test
<there is a blank line here>

A linha em branco é porque echo adiciona \n à string. Você precisaria então substituir cat por algo como

while read data && [ "$data" != "" ]
do    echo "Got $data"
done

Como você controla o que publica, talvez prefira enviar linhas únicas de dados ou encerrar mensagens com uma string especial que pode ser facilmente identificada como ===eof=== .

    
por 15.04.2018 / 18:58

Tags