Os comandos geralmente não armazenam em buffer suas entradas. Eles fariam um valor read()
para um pedaço grande, mas, ao ler de um canal, se não houver muitos bytes no canal, a read()
chamada do sistema retornará com o máximo de caracteres existentes e o aplicativo geralmente trabalhará com isso, se puder .
Uma exceção notável é a mawk
que permanecerá read()
até que o buffer de entrada esteja cheio.
Os aplicativos armazenam em buffer sua saída (stdout). O comportamento usual é que, se a saída estiver indo para um tty, o buffer será em linha (isto é, não começará a gravar no stdout até que tenha uma linha completa para a saída ou um bloco cheio por muito tempo). linha longa), enquanto que para todos os outros tipos de arquivo, o buffer é em blocos (ou seja, não começa a escrever até que haja um bloco completo para escrever (algo como 4KiB / 8KiB ... depende do software e do sistema )).
Portanto, no seu caso, LongRunningCommand
provavelmente armazena em buffer sua saída em blocos (já que sua saída é um pipe e não um tty), e tr
provavelmente armazena em buffer sua saída por linha, já que provavelmente é o terminal.
Mas, como você remove todos os caracteres de nova linha de sua saída, ele nunca gera uma linha, portanto o buffer será por bloco.
Então, aqui você deseja desativar o buffer para ambos LongRunningCommand
e tr
. Nos sistemas GNU ou FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Observe que se você deseja unir as linhas com uma vírgula, é melhor usar uma abordagem paste -sd , -
. Dessa forma, a saída será finalizada por um caractere de nova linha (você provavelmente ainda precisará desativar o buffer).
stdbuf
no LongRunningCommand ou no tr, ou em ambos, de maneira diferente?