Entonces, cuando wget
obtiene una página web, le muestra una barra de estado que indica cuánto se descargan los archivos. Se parece a esto:
25%[=============>______________________________________] 25,000 100.0K/s
(los guiones bajos son espacios; simplemente no pude encontrar la manera de obtener más de un espacio consecutivo allí)
Sin embargo, en lugar de escribir otra línea en stdout y agregar otra barra de progreso, la actualiza, así:
50%[===========================>________________________] 50,000 100.0K/s
Y wget
tampoco es el único ejemplo de esto. Por ejemplo, cuando canaliza algo less
y luego sale, su solicitud original todavía está allí, junto con el resultado de los comandos que ejecutó anteriormente. Es como si nunca te hubieras ido.
Entonces, mis preguntas son, ¿cómo se llama esto? ¿Cómo lo implemento? ¿Funciona solo para una sola línea a la vez? ¿Puedo usar esto en C?
Respuestas:
En primer lugar, su pregunta no tiene nada que ver con bash sino con el terminal. El terminal está respondiendo para mostrar el texto de los programas y bash no tiene control sobre los programas una vez que se iniciaron.
Los terminales ofrecen secuencias de control para controlar el color, la fuente, la posición del cursor y más. Para obtener una lista de secuencias de terminales estandarizadas, visite http://www.termsys.demon.co.uk/vtansi.htm . Puede, por ejemplo,
para crear una barra de progreso.
Las secuencias de escape de terminal más avanzadas suelen depender de la terminal, por ejemplo, funcionan solo con Eterm o xterm. ncurses : es una biblioteca de programación que crea programas interactivos con el terminal para que no tenga que usar secuencias de escape.
Cómo sobrescribir una línea existente con secuencias terminales
Cómo sobrescribir una línea existente sin secuencia terminal
Una solución simple es no escribir una nueva línea al final, sino escribir el retorno de carro, que básicamente restablece el cursor al comienzo de la línea, por ejemplo:
El
\r
retorno de carro o colocará el cursor al comienzo de la línea y le permitirá sobrescribir el contenido de la línea.Cambiar entre buffers como
less
ovi
El comportamiento de
less
también se debe a una función de terminal más avanzada, la pantalla alternativa:http://rosettacode.org/wiki/Terminal_control/Preserve_screen enumera algunos ejemplos de cómo hacerlo usted mismo, ya sea a través de tput o mediante algunas secuencias de escape.
fuente
En lugar de usar
echo
que agrega automáticamente una nueva línea a la cadena, useprintf "%s\r" whatever
: el retorno de carro envía el cursor al comienzo de la línea actual. ejemplo:fuente
printf "\r%2d " $num