É um pouco complicado, porque todas essas utilidades ( sed
, awk
, grep
) são armazenadas em buffer de linha. Isso significa que eles imprimem a saída somente quando a linha termina (uma nova linha foi aprovada). Eles não podem ler o caractere de entrada por caractere.
Então, para testar, fiz uma pequena sequência que simula seu comportamento:
{
echo -n "first task: "
sleep 2
echo "done"
echo -n "second task: "
sleep 2
echo "done"
}
Como na sua pergunta, imprime first task:
e após 2 segundos done
. Tente você mesmo copiando-o no seu terminal.
Solução:
Adicione o seguinte ao seu comando:
IFS=
command | { x=1; while IFS= read -d'' -s -N 1 char; do
[ $x ] && printf "Remote: "
printf "$char"
unset x
[ "$char" == "
" ] && x=1
done; }
Explicação:
O read
incorporado em bash
pode ler caracteres de entrada por caractere. A parte read -d'' -s -N 1 char
desativa o delimitador -d''
, ativa o modo silencioso -s
e lê apenas 1 caractere por vez -N 1
na variável $char
. Em seguida, o comando verifica se a variável $x
existe. Se sim, estamos em uma nova linha e imprimimos o "prefixo". Em seguida, imprima o personagem. Desativar $x
. Em seguida, a última instrução verifica se o caractere é uma nova linha. Se for uma nova linha, defina $x
a 1
e, no próximo loop, o "prefixo" será impresso.
A coisa toda pode ser testada, quando você concatente as duas seqüências:
{
echo -n "first task: "
sleep 2
echo "done"
echo -n "second task: "
sleep 2
echo "done"
} | { x=1; while IFS= read -d'' -s -N 1 char; do
[ $x ] && printf "Remote: "
printf "$char"
unset x
[ "$char" == "
" ] && x=1
done; }