Faire disparaître le texte après la saisie par l'utilisateur

9

Existe-t-il un moyen de faire disparaître le contenu affiché juste après que l'utilisateur a saisi?

Par exemple, prenez ce fichier ci-dessous

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

Si vous exécutez cela, la sortie est

how are you ? yHave fun

Je cherche quelque chose qui me permette de how are you ?disparaître dès que l'utilisateur appuie sur une touche

Et puis après avoir disparu, imprimez Have fun

Donc, je veux que la dernière sortie du programme ci-dessus soit seulement

Have fun

Remarque: En outre, tout élément au-dessus de ce script qui est imprimé sur l'écran du shell ne doit pas être effacé.

j'utilise bash

GypsyCosmonaut
la source
2
utiliser clearentre les deux echon'est pas une option?
sebasth
1
Non, cleareffacera la sortie déjà imprimée ci-dessus à l'écran s'il y en a. @sebasth
GypsyCosmonaut
D'où Are you finevient-il? N'est-ce pas How are you?
Barmar
@Barmar ouais, désolé c'est par erreur, corrigé maintenant
GypsyCosmonaut

Réponses:

12

Vous pouvez utiliser:

tput cr

(ou printf '\r') pour déplacer le curseur au début de la ligne. Suivi par:

tput el

pour tout supprimer jusqu'à la fin de la ligne. ( tcshet zshaussi avoir la fonction echotcintégrée que vous pouvez utiliser avec l' termcapéquivalent de celle-ci terminfo el: echotc ce(également echoti eldans zsh))

Stéphane Chazelas
la source
14

Utilisez un retour chariot ( \r). Ce caractère spécial (un reste du temps des machines à écrire mécaniques) ramènera le curseur au début de la ligne. Ensuite, vous avez besoin d'autant d'espaces que le message que vous souhaitez supprimer (cela écrasera le message), puis un deuxième retour chariot pour revenir au début avant d'imprimer le message suivant. Quelque chose comme ça:

#!/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

L'exécution du script ci-dessus imprime:

$ foo.sh
foo
Have fun        
terdon
la source
1
Au lieu de deux, \rvous pouvez mettre tous les espaces entre \rHave funet \n.
Barmar
2

Il existe un certain nombre de façons de le faire, allant de la preuve idiote à l'élégant.

La méthode la plus infaillible (bien que la plupart des travaux) est l'espace arrière arrière répété cependant autant de fois nécessaire. Cela fonctionne sur tout sauf les télétypes (retirer l'encre du papier est un défi).

Ensuite, l'échelle est le retour chariot. Cela ne fonctionne pas avec les émulateurs de terminal qui insèrent un saut de ligne avant ou après chaque retour chariot (c'est une option que minicom et d'autres peuvent être configurés pour avoir).

Ensuite, il y a les astuces spécifiques au terminal, je ne mentionnerai que les codes de capacité termcap, car les bases de données termcap et terminfo peuvent montrer l'utilisation. (Voici une liste.)

Simple pour une seule ligne, déplacez-vous vers la colonne (ch), puis effacez jusqu'à la fin de la ligne (ce).

Pour les cas plus compliqués, y compris les réponses sur plusieurs lignes, il y a sauvegarde de la position absolue (sc), invite, lecture de la réponse, restauration de la position du curseur (rc), effacement jusqu'à la fin de l'écran (cd).

Dans la plupart des cas, vous pouvez coder en dur les valeurs vt100 pour les deux dernières réponses car la plupart des émulateurs de terminal sont compatibles avec elle. Bien sûr, tous les terminaux ne prennent pas en charge ces options, mais ceux qui ne le sont pas sont rares et obsolètes.

hildred
la source