Você obteve a saída de linhas parciais, como parte da mesma linha no ponto em que a nova linha foi impressa. As partes da linha são armazenadas em buffer em read
, isso é o que faz :
The read utility shall read a single logical line from standard input
Por exemplo, isso imprime <foobar>
após um segundo, não <foo><bar>
.
(echo -n foo ; sleep 1 ; echo bar) | (read x ; echo "<$x>")
Se você deseja capturar informações em partes menores do que linhas completas, será necessário fazer outra coisa, por exemplo, com Perl. Isso imprimiria <foo><bar\n>
(com a nova linha antes do último >
, já que ao contrário de read
, Perl não lida com a nova linha final especialmente. Não importa com a coloração.)
(echo -n foo ; sleep 1 ; echo bar) |
perl -e '$|=1; while(sysread STDIN,$a,9999) { print "<$a>"}'
Se você tiver os códigos de controle para cores ( RED
e COLORRESET
) exportados no ambiente, você pode usá-los no script Perl como aqui:
perl -e '$|=1; while(sysread STDIN,$a,9999) {print "$ENV{RED}$a$ENV{COLORRESET}"}'