tr
parece amortiguar su entrada para que este comando LongRunningCommand|tr \\n ,
solo comience a producir resultados después de que se hayan acumulado unos pocos kilobytes de entrada de LongRunningCommand.
¿Hay alguna forma de forzar tr
a detener este almacenamiento en búfer o cualquier otro comando que pueda reemplazar las nuevas líneas con otro carácter sin almacenar en búfer?
PD: Ya he probado las dos primeras sugerencias de Desactivar el almacenamiento en búfer en la tubería sin éxito.
stdbuf
aplicaste a LongRunningCommand o tr, o a ambos, de manera diferente?stdbuf -o0 fping -aAq -r2 -g 10.30.0.1 10.30.0.255 2>/dev/null | stdbuf -i0 tr \\n ,
fping -q
dice "No mostrar los resultados por sondeo, sino solo el resumen final", ¿entonces tal vez solo escriba uno largo al final?tr
. Prueba|stdbuf -i0 -o0 tr ...
Respuestas:
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, laread()
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á apareciendoread()
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), ytr
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
ytr
. En sistemas GNU o FreeBSD: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).fuente
sed
. lo siento si fue molesto, pero no me di cuenta de que era conocimiento general. Supongo que usa LD_PRELOAD.Para reemplazar las nuevas líneas con
","
, puede ejecutarGNU awk (
gawk
) y Solarisnawk
se ejecutarán con buffering de línea en stdin y sin stdout de buffering cuando la salida es a una terminal. Si su awk esmawk
, lo que sucede en Ubuntu, puede darle la-W interactive
opción de obtener el mismo comportamiento de almacenamiento en búfer.fuente