Considere o seguinte script de shell:
function thetee {
tee data.out
}
function thepipe {
echo "Hello!"
}
while true; do
echo "Hi there!"
done | thetee | thepipe
echo "Done."
O while
-loop aqui é um gerador de linhas ilimitadas com o texto "Hi there!".
Executando:
$ sh script.sh
Hello!
Done.
Em seguida, observe o número de linhas em data.out
:
$ wc -l data.out
274 data.out
Novamente:
$ sh script.sh
Hello!
Done.
$ wc -l data.out
236 data.out
Problemas:
- O loop infinito não é infinito.
- O número de linhas de saída difere entre as execuções.
Razões:
-
A função
thepipe
no meu exemplo simplesmente ecoa uma string e sai, fazendo com que o pipe falhe. Nenhuma entrada adicional pode ser processada pelo último estágio do pipeline e o loop sai. -
O número de linhas realmente gravadas em
data.out
depende da rapidez com que o shell é capaz de inicializar o pipeline e com que rapidez a funçãothepipe
pode fazer a sua coisa e sair.
No seu caso, isso acontece tão rapidamente que nenhuma entrada do gerador de dados ( mosquitto_sub
) é capaz de chegar à função tee
.
Solução:
Faça a função thepipe
realmente consumir sua entrada :
function thepipe {
echo "Hello!"
cat
}
Isso fará com que o código no meu exemplo exiba um único "Hello!" seguido por infinito "Hi there!" (que também são salvos em data.out
). O echo
no final nunca será executado.
Portanto:
Altere a definição da sua função testPipe
de maneira semelhante. Por exemplo:
function testPipe(){
echo "va"
cat
}
Isso terá o efeito de consumir a entrada e enviá-la para o próximo estágio do pipeline ou, se estiver no final de um pipeline, para onde a saída padrão for redirecionada após ela (com uma linha contendo o string va
no início do fluxo).