Cuando se trabaja con la salida estándar (la pantalla o archivo donde se envía la información o flujo de salida de los comandos ejecutados) en Bash, puede ser útil o necesario borrar contenido (caracteres) luego de que ya ha sido enviado a la misma. Para ello, en sistemas GNU/Linux, se puede recurrir a la herramienta tput
. He aquí algunos ejemplos de su uso.
La herramienta tput
tiene la capacidad de inicializar o manipular una terminal (por ejemplo mover el cursor o borrar caracteres), además de obtener y restaurar todo tipo de configuración acerca de la misma (capabilities). Incluso es capaz de alterar colores.
Veamos directamente algunos ejemplos.
Supongamos que muestro el texto "pepe" por pantalla, espero 2 segundos, y luego imprimo un salto de línea. El resultado sería el siguiente:
admin@devuan:~$ echo -n pepe; sleep 2; echo pepe
En general no es común alterar la terminal dentro de scripts Bash. Pero en ocasiones puede requerirse algún tipo de salida interactiva, que muestre información en tiempo real en una única pantalla (es decir, sin tener que redibujar toda la pantalla cada vez que se necesita alterar algún valor). Por ejemplo, como lo hace la herramienta top
: la salida se altera constantemente, pero dentro se restringe al espacio de una única pantalla. De esta forma no se llena el historial de pantalla de la sesión (scrollback) con pantallazos cada 1 segundo).
En este tipo de situaciones puede ser de ayuda esta herramienta.
Borrar hasta el comienzo de la línea actual
Luego de mostrar "pepe" por pantalla, es posible borrar todo el contenido desde la posición actual del cursor hasta el comienzo de línea, ejecutando:
tput el1
Así se podría reemplazar "pepe", por cualquier otro contenido, por ejemplo, "hola":
admin@devuan:~$ echo -n pepe; sleep 2; tput el1; echo hola hola
El problema es que se ha borrado, pero no se ha modificado la posición del cursor.
Mover el cursor hasta el comienzo de línea actual
No hay una capability específica para realizar esta acción, por lo que simplemente se puede llevar el cursor a la columna 0 de la línea actual (primero será necesario determinar el número de línea actual). Aunque también es posible mover el cursor a izquierda un número exagerado de veces:
tput cub 666
Este comando mueve el cursor 666 lugares a izquierda (recordemos que la terminal promedio tiene 80 caracteres de ancho).
De esta forma se logra el resultado de borrar completamente la línea actual y reemplazar su contenido por otro:
admin@devuan:~$ echo -n pepe; sleep 2; tput el1; tput cub 666; echo hola hola
Borrar la línea anterior
¿Qué pasa si deseamos borrar una línea que ya ha sido escrita? Por ejemplo la línea anterior.
Al ingresar "pepe" junto con un salto de línea, los comandos anteriores no funcionan:
admin@devuan:~$ echo pepe; tput el1; tput cub 666; echo hola pepe hola
Esto se debe a que, luego de escribir "pepe" por pantalla, el cursor está en la siguiente línea. Lo que se necesita entonces, es volver a la línea anterior:
tput cuu1
Independientemente de la columna actual, al volver (ejecutando tput cuu1
), el cursor queda posicionado en la primer columna de la línea anterior:
admin@devuan:~$ echo pepe; sleep 2; tput cuu1; echo X Xepe
Al ingresar nuevo texto, el contenido previo se sobrescribe.
Borrar la línea anterior
Para lograr esto, una vez situado el cursor en la línea anterior (y en la columna 1), se debe borrar el contenido desde la posición actual del cursor hasta el fin de línea ejecutando:
tput cuu1 tput el
Que es lo mismo que ejecutar:
tput cuu1; tput el
O de forma segura (borrar sólo si pudo volver a la línea anterior correctamente):
tput cuu1 && tput el
admin@devuan:~$ echo pepe; sleep 2; tput cuu1; tput el; echo X X
Capabilities
La base de datos de capacidades de la terminal se encuentran documentadas en la página de manual (5) de terminfo
:
man 5 terminfo
¿Qué pasa si se redirecciona la salida por pantalla a un archivo?
Funciona correctamente:
admin@devuan:/tmp$ echo -n pepe; tput el1; echo hola hola admin@devuan:/tmp$ (echo -n pepe; tput el1; echo hola) > salida.txt admin@devuan:/tmp$ cat salida.txt hola
Para más información:
Colours and Cursor Movement With tput
man tput man 5 terminfo
Tal vez pueda interesarte