2011-02-26 11 views
9

Me preguntaba si era posible decirle a bash que todas las llamadas a echo o printf deberían ser seguidas por una llamada posterior a fflush() en stdout/stderr, respectivamente?Forzar una secuencia de comandos shell para fflush

Una solución rápida y sucia sería escribir mi propia implementación de printf que hiciera esto y usarla en lugar de cualquiera de las integradas, pero se me ocurrió que no era necesario.

Estoy escribiendo varios scripts de compilación que se ejecutan a la vez, para las necesidades de depuración I realmente necesito ver los mensajes que escriben en orden.

+0

No, que yo sepa, creo que BASH está completamente basado línea de lo que hará que se vacíe el línea por línea, pero no más. ¿Hay una necesidad de no tirar en las nuevas líneas? –

+0

@Robert - Sí, tengo que eliminar los errores de sincronización como un culpable, por lo tanto, tengo que asegurarme de que cada escritura en stderr/stdout haga que la secuencia se vacíe. –

+0

Agarrando pajillas: me pregunto si sería útil establecer algo usando 'stty'. O usando el script 'expect' llamado' unbuffer'. O estableciendo Bash's 'PS4' para incluir' $ (date "+% s.% N") '(aunque hay un poco de sobrecarga allí) y usando' set -x' y ordenando el resultado. Tal vez algo usando 'trap 'foo' DEBUG. ¿Proporciona [this] (http://www.pixelbeat.org/programming/stdio_buffering/) alguna información útil? O algo [aquí] (http://stackoverflow.com/questions/1507674/how-to-add-timestamp-to-stderr-redirection)? –

Respuesta

10

Si los comands usan stdio y están conectados a un terminal, se enjuagarán por línea. De lo contrario, tendrá que usar algo como stdbuf de comandos en una línea de tubería http://www.pixelbeat.org/programming/stdio_buffering/

tl; dr: en lugar de printf ... tratar de poner a la secuencia de comandos stdbuf -o0 printf .. o stdbuf -oL printf ...

+0

Estaba pensando en implementar stdbuf de forma independiente , Estoy lidiando con un problema de portabilidad con sistemas que tienen una versión anterior de coreutils (o, simplemente, 'xxprintf' que simplemente vacía la transmisión/fd) –

+0

Parece que la única forma de hacerlo es con stdbuff, implementando usted mismo si no está presente. –

0

Tal vez "stty en bruto" puede ayuda con algunos otros trucos para el manejo de fin de línea. El modo AFAIK "raw" desactiva el almacenamiento en búfer basado en línea, al menos cuando se utiliza para el puerto serie ("stty raw </dev/ttyS0").

1

Si fuerza la lectura del archivo, parece que hace que el búfer se descargue. Estos funcionan para mí.

Cualquiera de leer los datos en una variable inútil:

x=$(<$logfile) 

O hacer un UUOC:

cat $logfile > /dev/null 
Cuestiones relacionadas