Apenas insira o comando em um loop while
. Existem várias nuances para isso, mas basicamente (em bash
ou qualquer shell POSIX):
longcommand |
while IFS= read -r line
do
whatever "$line"
done
A outra pegadinha principal com isso (além das coisas IFS
abaixo) é quando você tenta usar as variáveis dentro do loop depois de terminar. Isso ocorre porque o loop é realmente executado em um sub-shell (apenas outro processo do shell) do qual você não pode acessar variáveis (também termina quando o loop faz, em cujo ponto as variáveis estão completamente ausentes. Para contornar isso, você pode fazer:
longcommand | {
while IFS= read -r line
do
whatever "$line"
lastline="$line"
done
# This won't work without the braces.
echo "The last line was: $lastline"
}
O exemplo de Hauke de definir lastpipe
em bash
é outra solução.
Atualizar
Para certificar-se de que você está processando a saída do comando 'como acontece', você pode usar stdbuf
para definir o processo ' stdout
como buffer de linha.
stdbuf -oL longcommand |
while IFS= read -r line
do
whatever "$line"
done
Isso configurará o processo para gravar uma linha por vez no canal, em vez de armazenar internamente sua saída em blocos. Tenha em atenção que o programa pode alterar esta configuração internamente. Um efeito semelhante pode ser obtido com unbuffer
(parte de expect
) ou script
.
stdbuf
está disponível nos sistemas GNU e FreeBSD, ele afeta somente o buffer stdio
e funciona apenas para aplicativos não-setuid, não-setgid que são dinamicamente vinculados (como ele usa um Truque LD_PRELOAD).