Isso é basicamente uma duplicata da minha resposta no SO . No entanto, como ninguém mencionou o comando stdbuf
aqui, senti que também deveria acrescentar isso aqui.
===============
Basicamente, um processo que lê de um pipe pode consumir os dados byte a byte assim que eles estiverem disponíveis no pipe. No entanto, desde que os programas usem as funções std io da libc, como read, write etc, a libc armazenará em buffer a entrada / saída desses programas dependendo se um programa está gravando ou não em um terminal.
Por padrão, se um programa estiver gravando em um terminal, a libc armazenará em buffer a linha de saída, se não for para um terminal, ele será armazenado em bloco.
No Linux, com o glibc, você pode influenciar esse comportamento usando o comando stdbuf
, assim:
stdbuf -oL cat | stdbuf -ioL sed '' | stdbuf -iL sed ''
Estou usando um buffer de saída baseado em linha para o comando cat
, um buffer de entrada e saída baseado em linha para o primeiro comando sed
e um buffer de entrada baseado em linha para o último comando sed
.