Hacer que el texto desaparezca después de la entrada del usuario

9

¿Hay alguna manera de hacer desaparecer el contenido que se muestra justo después de que el usuario ingrese?

Por ejemplo, tome este archivo a continuación

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

Si ejecuta esto, la salida es

how are you ? yHave fun

Estoy buscando algo que me permita hacer how are you ?desaparecer tan pronto como el usuario presione una tecla

Y luego, después de desaparecer, imprimir Have fun

Entonces, quiero que la última salida del programa anterior sea solo

Have fun

Nota: Además, no se debe borrar nada sobre este script que esté impreso en la pantalla de la shell.

estoy usando bash

GitanoCosmonauta
fuente
2
usando clearentre echos no es una opción?
sebasth
1
No, clearborrará la salida que ya está impresa arriba en la pantalla si hay alguna. @sebasth
GypsyCosmonaut
De donde Are you fineviene ¿No debería ser eso How are you?
Barmar
@Barmar, sí, lo siento por error, corregido ahora
GypsyCosmonaut

Respuestas:

12

Puedes usar:

tput cr

(o printf '\r') para mover el cursor al comienzo de la línea. Seguido por:

tput el

para eliminar todo hasta el final de la línea. ( tcshy zshtambién tiene el echotcincorporado que puede usar con el termcapequivalente de eso terminfo el: echotc ce(también echoti elen zsh))

Stéphane Chazelas
fuente
14

Use un retorno de carro ( \r). Este carácter especial (un remanente de los días de las máquinas de escribir mecánicas) moverá el cursor de regreso al comienzo de la línea. Luego, necesita tantos espacios como el mensaje que desea eliminar (esto sobrescribirá el mensaje) y luego un segundo retorno de carro para volver al principio antes de imprimir el siguiente mensaje. Algo como esto:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

Ejecutar el script anterior imprime:

$ foo.sh
foo
Have fun        
terdon
fuente
1
En lugar de dos \r, podría poner todos los espacios entre \rHave funy \n.
Barmar
2

Hay varias maneras de hacer esto, desde pruebas idiotas hasta elegantes.

El método más infalible (aunque la mayoría del trabajo) es el espacio de retroceso del espacio de retroceso repetido sin embargo, tantas veces como sea necesario. Esto funciona en todo menos en los teletipos (eliminar la tinta del papel es un desafío).

A continuación, la escala es espacios de retorno de carro retorno de carro. Esto no funciona con emuladores de terminal que insertan un salto de línea antes o después de cada retorno de carro (esta es una opción minicom y otras pueden configurarse para tener).

Luego están los trucos específicos del terminal. Solo mencionaré los códigos de capacidad de termcap, ya que las bases de datos de termcap y terminfo pueden mostrar el uso. (Aquí hay una lista).

Simple para una sola línea es mover a la columna (ch) seguido de borrar al final de la línea (ce).

Para casos más complicados, incluidas las respuestas de varias líneas, hay guardar la posición absoluta (sc), solicitar, leer la respuesta, restaurar la posición del cursor (rc), borrar hasta el final de la pantalla (cd).

En la mayoría de los casos, puede codificar los valores de vt100 para las dos últimas respuestas, ya que la mayoría de los emuladores de terminal son compatibles con él. Por supuesto, no todas las terminales admiten esas opciones, pero las que no son raras y obsoletas.

hildred
fuente