Wie verwende ich Bash Read mit einer Zeitüberschreitung?

71

Ich kann den Benutzer zu drücken frage Enterunter Verwendung read, und er durch den Aufruf warten sleep. Aber ich kann mir keine Möglichkeit vorstellen, beides gleichzeitig zu tun. Ich möchte, dass der Benutzer die Wahl hat:

Drücken Sie Ctrl+, Cum abzubrechen, Enter um fortzufahren, oder warten Sie nur 10 Sekunden

Wie kann ich das machen?

qdii
quelle

Antworten:

136

In bash, readhat eine -tOption , wo Sie ein Timeout angeben. Aus der Manpage:

read [-ers] [-u fd] [-t timeout] [-a aname] [-p prompt] [-n nchars] [-d delim] [name ...]

-t timeout: Zeitüberschreitung beim Lesen verursachen und Fehler zurückgeben, wenn eine vollständige Eingabezeile nicht innerhalb von Zeitüberschreitungssekunden gelesen wird. Diese Option hat keine Auswirkung, wenn beim Lesen keine Eingaben vom Terminal oder einer Pipe gelesen werden.

Transkript unten (ohne ENTER zu drücken):

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:29:15 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:29:25 WAST 2012

Ein anderer, der nach ein paar Sekunden ENTER drückt:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; date
Tue Feb 28 22:30:17 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:30:19 WAST 2012

Und noch eine, die STRG-C drückt:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:30:29 WAST 2012
Hit ENTER or wait ten seconds
paxdiablo
quelle
6
Ich finde es absolut toll, wenn so detaillierte Antworten gegeben werden. Hut ab!
Brian
Ubuntu. -t - illegale Option
ses
@ses, stellen Sie sicher, dass Sie das eingebaute Bash verwenden, kein externes Tool.
Paxdiablo
Wenn Sie ein Shell-Skript schreiben, stellen Sie sicher, dass es mit einem #!/bin/bashanstelle von beginnt #!/bin/sh. Letzteres kann funktionieren oder auch nicht, je nachdem, welche Binärdatei /bin/shtatsächlich ist. Sie dürfen #!/bin/shgenau dann schreiben, wenn Ihr Skript POSIX-kompatibel ist, was es ziemlich sicher nicht ist.
Mikko Rantalainen
Wenn Sie dies verwenden, stellen Sie sicher, dass Ihr Skript #!/bin/bashnicht ist #!/bin/sh, da die -tOption nicht POSIX-kompatibel ist (obwohl das Skript möglicherweise nicht auf jedem Computer funktioniert)
Marian
16

Das readeingebaute hat eine Zeitüberschreitung.

read -t 10

werde es tun

Johannes Weiss
quelle
1

Aus dem Bash-Referenzhandbuch :

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt][-t timeout][-u fd] [name ...]

Benoit
quelle