Ich habe das folgende Bash-Skript:
# do some time consuming task here
read -p "Give me some input: " input
Nun, wie Sie vielleicht erraten haben, wird die unerwünschte Eingabe ebenfalls berücksichtigt, wenn ein Benutzer während der "zeitaufwendigen Aufgabe" einige zufällige Tasten drückt. Wie lösche stdin
(oder ignoriere) ich es, bevor ich den Lesebefehl erteile?
Antworten:
Ich glaube nicht, dass es eine Möglichkeit gibt, stdin zu löschen, aber (mit bash) können Sie lesen und verwerfen, was da ist, bevor Sie nach der Eingabe fragen
Dies liest stdin und hat eine Zeitüberschreitung von 1 Sekunde. Es schlägt jedoch fehl, wenn stdin mehr als 10000 Zeichen enthält. Ich weiß nicht, wie groß Sie den Parameter nchars machen können.
quelle
In Bash 4 können Sie
-t
(Timeout) auf einstellen0
. In diesem Fall wirdread
sofort mit einem Beendigungsstatus zurückgegeben, der angibt, ob Daten warten oder nicht:quelle
Hiermit werden mehrere Eingabezeilen gelesen, wenn der Benutzer versehentlich mehrmals die Eingabetaste gedrückt hat
quelle
das hat bei mir gut funktioniert:
quelle
-e
in diesem Fall?Fügen Sie die zeitaufwändige Aufgabe in einen Block ein, dessen stdin geschlossen ist:
quelle
read
liest immer noch die erste Zeile, die während der# time consuming
Aufgabe eingegeben wurde . Wenn das Skript keine Befehle enthält, die stdin nachread
dem lesen, werden die ungelesenen Zeilen auf dem interaktiven Terminal ausgeführt, nachdem das Skript beendet wurde. Hat jemand dies erfolgreich getestet?Aufbauend auf der Antwort von christophjaeger habe ich hinzugefügt
-s
, dass die Eingabe nicht in das Terminal zurückgesendet wird und-n
nicht auf eine neue Zeile wartet.quelle
-n
ist eine gute Idee, aber zwei frühere Antworten haben es bereits erwähnt. Und da der Sinn dieser Übung darin besteht, alles zu lesen und zu verwerfen, was vor derread
Ausführung eingegeben wurde , verstehe ich nicht, was Ihrer Meinung nach das-s
bewirken wird.quelle