`unbuffer` o` stdbuf` para eliminar el almacenamiento en búfer stdout?


13

¿Hay alguna diferencia entre unbuffer (1) y stdbuf (1)? Por lo que deduzco, unbuffer hace más que el "mejor esfuerzo" de llamar al conjunto de funciones libc (X) buf al principio, y luego dejar que las cosas sean.

Respuestas:


14

Trabajan de maneras completamente diferentes.

El programa que utiliza unbuffer espera ejecutar el comando nombrado. Debido a que esperar crea una pseudo-tty para adjuntar a la stdout del proceso hijo, el niño podría ser engañado pensando que debería usar el almacenamiento en línea en lugar del almacenamiento en bloque. Algunos programas cambiarán su comportamiento cuando isatty (stdout) sea cierto, otros no lo harán y es muy difícil saber qué lo hará y cuáles no.

El programa stdbuf intenta poner libstdbuf delante de libc para binarios cargados dinámicamente. Donde libstdbuf redefine la estrategia de almacenamiento en búfer predeterminada de las llamadas libc stdio.

Descubrí esto por

 apt-get source expect coreutils

y leer la fuente relevante para cada programa.


Algunas cosas preocupantes (de la página de manual): unbuffer -ppuede parecer que funcionan incorrectamente si sale un proceso de alimentación de entrada a unbuffer. Considere: process1 | unbuffer -p process2 | process3Si el proceso1 sale, el proceso2 puede que aún no haya terminado. Es imposible que unbuffer sepa esperar mucho
dan3

Parece que stdbuf también puede controlar el almacenamiento en búfer stdin de los programas que usan flujos C, lo que parece importante. Quizás esto debería incluirse en la respuesta para beneficio de futuros lectores.
dan3
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.