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


Compartí este artículo