Você não precisa ficar tão chique; você pode observar o mesmo efeito com
{ echo 'foo' ; sleep 10 ; } | grep oo | grep oo
ou
{ echo 'foo' ; sleep 10 ; } | grep oo | cat
ou
- Abra dois terminais.
Vá para o mesmo diretório em ambos (por exemplo, seu diretório inicial ou
/tmp
). - Em um, faça
{ echo 'foo' ; sleep 10 ; } | grep oo > foo.out
. - No outro, faça
ls -ld foo.out
repetidamente.
Você verá que o arquivofoo.out
aparece imediatamente, mas é o tamanho 0 por dez segundos, após o qual se torna 4 bytes.
Simplesmente: grep
testa para ver se sua saída (padrão) é um terminal.
Se estiver, grava a saída tão rapidamente quanto a saída para gravar.
Se não for, ele armazena em buffer sua saída e grava N bytes por vez,
onde N é tipicamente 512, mas pode ser diferente em algumas implementações.