Lassen Sie Text nach Benutzereingaben verschwinden

9

Gibt es eine Möglichkeit, den angezeigten Inhalt nach Eingabe durch den Benutzer verschwinden zu lassen?

Nehmen Sie zum Beispiel diese Datei unten

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

Wenn Sie dies ausführen, ist die Ausgabe

how are you ? yHave fun

Ich suche nach etwas, das mich how are you ?verschwinden lässt, sobald der Benutzer eine Taste drückt

Und dann nach dem Verschwinden drucken Have fun

Ich möchte also, dass nur die letzte Ausgabe des obigen Programms ausgegeben wird

Have fun

Hinweis: Außerdem sollte alles über diesem Skript, was auf dem Shell-Bildschirm gedruckt wird, nicht gelöscht werden.

ich benutze bash

GypsyCosmonaut
quelle
2
mit cleardazwischen echoist nicht eine Option?
10.
1
Nein, clearlöscht die Ausgabe, die bereits oben auf dem Bildschirm gedruckt wurde, falls vorhanden. @sebasth
GypsyCosmonaut
Woher kommt Are you finedas? Sollte das nicht sein How are you?
Barmar
@Barmar ja, tut mir leid, das ist aus Versehen, jetzt korrigiert
GypsyCosmonaut

Antworten:

12

Sie können verwenden:

tput cr

(oder printf '\r') um den Cursor an den Zeilenanfang zu bewegen. Gefolgt von:

tput el

um alles bis zum Ende der Zeile zu löschen. ( tcshund zshhaben auch das echotceingebaute, das Sie mit dem termcapÄquivalent davon verwenden können terminfo el: echotc ce(auch echoti elin zsh))

Stéphane Chazelas
quelle
14

Verwenden Sie einen Wagenrücklauf ( \r). Dieses Sonderzeichen (ein Überbleibsel aus der Zeit der mechanischen Schreibmaschinen) bewegt den Cursor zurück zum Zeilenanfang. Dann benötigen Sie so viele Leerzeichen wie die Nachricht, die Sie löschen möchten (dies überschreibt die Nachricht), und dann einen zweiten Wagenrücklauf, um zum Anfang zurückzukehren, bevor Sie die nächste Nachricht drucken. Etwas wie das:

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

Wenn Sie das obige Skript ausführen, wird Folgendes gedruckt:

$ foo.sh
foo
Have fun        
terdon
quelle
1
Anstelle von zwei können \rSie alle Leerzeichen zwischen \rHave funund setzen \n.
Barmar
2

Es gibt eine Reihe von Möglichkeiten, von idiotensicher bis elegant.

Die narrensicherste Methode (obwohl die meiste Arbeit) ist die Rücktaste, die wiederholt wird, wie oft sie benötigt wird. Dies funktioniert bei allen außer Teletypen (das Entfernen von Tinte vom Papier ist eine Herausforderung).

Als nächstes ist die Skala Wagenrücklaufräume Wagenrücklauf. Dies funktioniert nicht mit Terminalemulatoren, die vor oder nach jedem Wagenrücklauf einen Zeilenvorschub einfügen (dies ist eine Option, für die Minicom und andere möglicherweise konfiguriert sind).

Dann gibt es die terminalspezifischen Tricks, die ich nur als Termcap-Funktionscodes erwähnen werde, da Termcap- und Terminfo-Datenbanken die Verwendung anzeigen können. (Hier ist eine Liste.)

Einfach für eine einzelne Zeile ist das Verschieben in Spalte (ch), gefolgt von Löschen bis zum Ende der Zeile (ce).

Für kompliziertere Fälle, einschließlich mehrzeiliger Antworten, gibt es die Option zum Speichern der absoluten Position (sc), zur Eingabeaufforderung, zum Lesen der Antwort, zum Wiederherstellen der Cursorposition (rc) und zum Löschen bis zum Ende des Bildschirms (cd).

In den meisten Fällen können Sie die vt100-Werte für die letzten beiden Antworten fest codieren, da die meisten Terminalemulatoren damit kompatibel sind. Natürlich unterstützen nicht alle Terminals diese Optionen, aber diejenigen, die nicht selten und veraltet sind.

hildred
quelle