Quiero implementar una barra de progreso que muestre los segundos transcurridos en bash. Para esto, necesito borrar la última línea que se muestra en la pantalla (el comando "borrar" borra toda la pantalla, pero necesito borrar solo la línea de la barra de progreso y reemplazarla con la nueva información).
El resultado final debería verse así:
$ Elapsed time 5 seconds
Luego, después de 10 segundos, quiero reemplazar esta oración (en la misma posición en la pantalla) por:
$ Elapsed time 15 seconds
for i in {1..100000}; do echo -en "\r$i"; done
para evitar la llamada secundaria :-)El retorno de carro por sí solo mueve el cursor al principio de la línea. Eso está bien si cada nueva línea de salida es al menos tan larga como la anterior, pero si la nueva línea es más corta, la línea anterior no se sobrescribirá por completo, por ejemplo:
Para borrar la línea del nuevo texto, puede agregar
\033[K
después de\r
:http://en.wikipedia.org/wiki/ANSI_escape_code
fuente
\e[K
lugar de\033[K
.\033[G
io\r
antes,\033[K
aunque obviamente\r
es mucho más simple. También invisible-island.net/xterm/ctlseqs/ctlseqs.html da más detalles que Wikipedia y es del desarrollador xterm.La respuesta de Derek Veit funciona bien siempre que la longitud de la línea nunca exceda el ancho del terminal. Si este no es el caso, el siguiente código evitará la salida basura:
antes de escribir la línea por primera vez, haz
que guarda la posición actual del cursor. Ahora, siempre que desee imprimir su línea, utilice
para volver primero a la posición guardada del cursor, luego borrar la pantalla desde el cursor hacia abajo y finalmente escribir la salida.
fuente
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed
lugar detput el
. Se usó el ejemplo de @ Umed
(tal vez lo arregló después de que usted comentó).El método \ 033 no me funcionó. El método \ r funciona pero en realidad no borra nada, solo coloca el cursor al principio de la línea. Entonces, si la nueva cadena es más corta que la anterior, puede ver el texto sobrante al final de la línea. Al final, tput fue el mejor camino a seguir. Tiene otros usos además del cursor, además de que viene preinstalado en muchas distribuciones de Linux y BSD, por lo que debería estar disponible para la mayoría de los usuarios de bash.
Aquí hay un pequeño guión de cuenta regresiva para jugar:
fuente
En caso de que la salida de progreso sea de varias líneas, o el script ya haya impreso el carácter de nueva línea, puede saltar líneas con algo como:
printf "\033[5A"
lo que hará que el cursor salte 5 líneas hacia arriba. Entonces puedes sobrescribir lo que necesites.
Si eso no funcionaría puede probar
printf "\e[5A"
oecho -e "\033[5A"
, lo que debería tener el mismo efecto.Básicamente, con las secuencias de escape puedes controlar casi todo en la pantalla.
fuente
tput cuu 5
, donde 5 es el número de filas (cuu
subir,cud
bajar).Utilice el carácter de retorno de carro:
fuente
Puede lograrlo colocando retorno de carro
\r
.En una sola línea de código con
printf
o con
echo -ne
fuente