2011-01-21 6 views
19

He ejecutado programas de línea de comandos que generan una línea, y luego actualizo esa línea un momento después. Pero con Ruby solo puedo dar salida a una línea y luego a otra línea.Escribir líneas de salida anteriores en el símbolo del sistema con ruby ​​

Lo que he de ser la salida ahora:

Downloading file: 
11MB 294K/s 
12MB 307K/s 
14MB 294K/s 
15MB 301K/s 
16MB 300K/s 
Done! 

Y en lugar, quiero ver esto:

Downloading file: 
11MB 294K/s 

siguió un momento después de esto:

Downloading file: 
16MB 300K/s 
Done! 

La línea de mis resultados de script de ruby ​​que muestran que el tamaño de archivo descargado y la velocidad de transferencia se sobrescribirán cada vez en lugar de la lista ing los valores actualizados como una nueva línea completa.

Actualmente estoy usando puts para generar resultados, lo que claramente no está diseñado para este caso. ¿Hay algún método de salida diferente que pueda lograr este resultado?

Respuesta

38

Utilice \r para mover el cursor al comienzo de la línea. Y no debe usar puts ya que agrega \n, use print en su lugar. De esta manera:

print "11MB 294K/s" 
print "\r" 
print "12MB 307K/s" 

Una cosa a tener en cuenta, sin embargo: \r no eliminar nada, sólo mueve el cursor hacia atrás, por lo que se necesita para rellenar la salida con espacios para sobrescribir la salida anterior (en caso de que fuera más largo).

De forma predeterminada, cuando se imprime \n en la salida estándar, se vacía el búfer. Ahora puede necesitar usar STDOUT.flush después de print para asegurarse de que el texto se imprima de inmediato.

+1

Esta solución no muestra salida hasta que se emite una nueva línea, o el programa termina, al parecer. Este ejemplo, por ejemplo 'print '123'; sleep 5; imprimir "\ r"; print "456" 'no imprime nada al principio, y luego imprime" 456 "5 segundos después. Entonces no me ayuda mucho. –

+1

Agregue 'STDOUT.flush' para enviarlo a la salida inmediatamente. Actualicé la respuesta también. – detunized

+0

Ahhhh eso tiene sentido. Eso se solucionó y está funcionando bien ahora, ¡gracias! –

Cuestiones relacionadas