(Nota para os futuros leitores: o tom de exasperação aqui não é para a questão, mas para os erros que cometi tentando respondê-lo e as múltiplas edições que eles implicaram.)
Oh, pelo amor de Deus. O problema está em tail -f
. Isso funciona muito bem:
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
/bin/echo $i
done;
} | cat
printf 'bye\n'
Não é o cachimbo, não é o grupo. É tail
. Como em perseguir nossas próprias caudas!
Portanto, tail -f
falhou porque não sai imediatamente por algum motivo. Não tenho certeza porque python -u
está falhando, mas não acho que seja algo no script. Talvez tente unbuffer
com isso. Tente o seu script com cat
, pelo menos, e verifique se ele está sem buffer nesse caso.
Tentativa anterior falhada intencionalmente deixada aqui para que futuros leitores possam entender os comentários.
Este script exibe o mesmo tipo de problema de buffer que você está recebendo:
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
printf '%s\n' $i
done;
} | tail -f
printf 'bye\n'
Este não é. A saída dentro do grupo é redirecionada para stderr, depois stderr do grupo inteiro é canalizado para o comando. Desde que é stderr, é unbuffered.
#!/bin/bash
printf 'hi\n'
{
for i in 1 2 3 4; do
sleep 0.5
printf '%s\n' $i 1>&2
done;
} |& tail -f
printf 'bye\n'
Adaptado da resposta de Wang HongQin em esta questão . A dificuldade estava em encontrar uma maneira de desabafar o tubo com chaves, em vez de um comando explícito. Tive que mexer um pouco para fazer o redirecionamento funcionar corretamente.