Fai sparire il testo dopo l'input dell'utente


9

C'è un modo per far scomparire il contenuto visualizzato subito dopo che l'utente ha inserito?

Ad esempio, prendi questo file di seguito

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

Se lo esegui, l'output è

how are you ? yHave fun

Sto cercando qualcosa che mi permetta di far how are you ?sparire non appena l'utente preme un tasto

E poi dopo essere scomparso, stampa Have fun

Quindi, voglio che l'ultimo output del programma sopra sia solo

Have fun

Nota: inoltre, qualsiasi cosa sopra a questo script stampato sulla schermata della shell non deve essere cancellata.

sto usando bash


2
usando cleartra echos non è un'opzione?
sebasth,

1
No, clearcancellerà l'output che è già stampato sopra sullo schermo, se presente. @sebasth
GypsyCosmonaut

Da dove Are you fineviene Non dovrebbe essere How are you?
Barmar,

@Barmar sì, mi dispiace che sia per errore, corretto ora
GypsyCosmonaut

Risposte:


12

Puoi usare:

tput cr

(o printf '\r') per spostare il cursore all'inizio della riga. Seguito da:

tput el

per eliminare tutto fino alla fine della riga. ( tcshe zshhai anche il echotcbuiltin che puoi usare con l' termcapequivalente di quello terminfo el: echotc ce(anche echoti elin zsh))


14

Utilizzare un ritorno a capo ( \r). Questo carattere speciale (rimasto dai tempi delle macchine da scrivere meccaniche) sposta il cursore all'inizio della riga. Quindi, sono necessari tutti gli spazi del messaggio che si desidera eliminare (questo sovrascriverà il messaggio) e quindi un secondo ritorno a capo per tornare all'inizio prima di stampare il messaggio successivo. Qualcosa come questo:

#!/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'esecuzione dello script sopra stampa:

$ foo.sh
foo
Have fun        

1
Invece di due \rpotresti mettere tutti gli spazi tra \rHave fune \n.
Barmar,

2

Ci sono molti modi per farlo, che vanno dalla prova dell'idiota all'eleganza.

Il metodo più infallibile (anche se la maggior parte del lavoro) è backspace spazio backspace ripetuto comunque molte volte necessario. Funziona su tutto tranne che sui teletipi (rimuovere l'inchiostro dalla carta è una sfida).

Successivamente la scala è il ritorno a capo degli spazi di ritorno a capo. Questo non funziona con gli emulatori di terminale che inseriscono un avanzamento di riga prima o dopo ogni ritorno a capo (questa è un'opzione minicom e altri possono essere configurati per avere).

Poi ci sono i trucchi specifici del terminale che menzionerò solo i codici di capacità di termcap poiché i database termcap e terminfo possono mostrare l'utilizzo. (Ecco un elenco.)

Semplice per una singola riga è lo spostamento nella colonna (ch) seguito da clear to end of line (ce).

Per i casi più complicati, comprese le risposte su più righe, è possibile salvare la posizione assoluta (sc), richiedere, leggere la risposta, ripristinare la posizione del cursore (rc), cancellare fino alla fine dello schermo (cd).

Nella maggior parte dei casi è possibile codificare i valori vt100 per le ultime due risposte poiché la maggior parte degli emulatori di terminali sono compatibili con esso. Naturalmente non tutti i terminali supportano queste opzioni, ma quelli che non sono rari e obsoleti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.