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
thepipeno 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.outdepende da rapidez com que o shell é capaz de inicializar o pipeline e com que rapidez a funçãothepipepode 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).