Los comandos generalmente no almacenan en búfer su entrada. Ellos hacen un read()
para una gran parte, pero cuando se lee de un tubo, si no hay que muchos bytes de la tubería, la read()
llamada al sistema volverán con el mayor número de caracteres que hay y la aplicación generalmente trabajar con eso, si puede .
Una notable excepción a eso es mawk
que seguirá apareciendo read()
hasta que el búfer de entrada esté lleno.
Sin embargo, las aplicaciones amortiguan su salida (stdout). El comportamiento habitual es que si la salida va a un tty, entonces el almacenamiento en búfer será en línea (es decir, no comenzará a escribir en stdout hasta que tenga una línea completa para la salida, o un bloque lleno por mucho tiempo). línea larga), mientras que para cualquier otro tipo de archivo, el almacenamiento en búfer es por bloques (es decir, no comenzará a escribir hasta que tenga un bloque lleno para escribir (algo como 4KiB / 8KiB ... depende del software y el sistema )).
Entonces, en su caso, es LongRunningCommand
probable que amortigüe su salida por bloques (ya que su salida es una tubería y no un tty), y tr
probablemente amortigua su salida por línea, ya que su salida es probablemente la terminal.
Pero, dado que elimina todos los caracteres de nueva línea de su salida, nunca generará una línea, por lo que el almacenamiento en búfer será por bloque.
Entonces, aquí desea deshabilitar el almacenamiento en búfer para ambos LongRunningCommand
y tr
. En sistemas GNU o FreeBSD:
stdbuf -o0 LongRunningCommand | stdbuf -o0 tr '\n' ,
Tenga en cuenta que si desea unir las líneas con una coma, es mejor utilizar un enfoque paste -sd , -
. De esa manera, la salida se terminará con un carácter de nueva línea (probablemente aún tendrá que deshabilitar el almacenamiento en búfer).
stdbuf
aplicaste a LongRunningCommand o tr, o a ambos, de manera diferente?