read
macht dies:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
Das -n1
gibt an, dass nur auf ein einzelnes Zeichen gewartet wird. Das -r
versetzt es in den Raw-Modus, was notwendig ist, da es sonst erst registriert wird, wenn Sie so etwas wie einen Backslash drücken, wenn Sie die nächste Taste drücken. Das -p
gibt die Eingabeaufforderung an, die in Anführungszeichen gesetzt werden muss, wenn sie Leerzeichen enthält. Das key
Argument ist nur erforderlich, wenn Sie wissen möchten, welche Taste sie gedrückt haben. In diesem Fall können Sie darauf zugreifen $key
.
Wenn Sie Bash verwenden, können Sie auch eine Zeitüberschreitung mit angeben -t
, die dazu führt, dass das Lesen einen Fehler zurückgibt, wenn eine Taste nicht gedrückt wird. Also zum Beispiel:
read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
echo 'A key was pressed.'
else
echo 'No key was pressed.'
fi
"Enter any non-NUL character to continue"
. Einige Tasten senden Sie keine Zeichen (wieCtrl
...) und einige senden mehr als ein (wieF1
,Home
...).bash
ignoriert NUL-Zeichen.Press a key to continue...
auch Anfänger diea
Taste finden und drücken; o)command | myscript.sh
oder habenmyscript.sh | command
. In dieser Antwort finden Sie eine Lösung.read: 1: read: Illegal option -n
stellen Sie sicher, dass Sie Ihren Befehlbash -c 'command && command'
usw. einschließen, da dieser Fehler wahrscheinlich von kommtsh
. Ich mache das in einem Lando-Wrapper-Befehl.Ich benutze diese Methoden sehr oft, die sehr kurz sind und wie @ theunamedguy- und @ Jim-Lösungen aussehen, aber zusätzlich mit Timeout und Silent-Modus.
Ich mag besonders den letzten Fall und verwende ihn in vielen Skripten, die in einer Schleife ausgeführt werden, bis der Benutzer drückt Enter.
Befehle
Lösung eingeben
Escape-Lösung (mit -d $ '\ e')
Beliebige Schlüssellösung (mit -n 1)
Frage mit vorausgewählter Auswahl (mit -ei $ 'Y')
Timeout-Lösung (mit -t 5)
Schlafverbesserter Alias
Erläuterung
-r gibt den Rohmodus an, der keine kombinierten Zeichen wie "\" oder "^" zulässt.
-s gibt den stillen Modus an und weil wir keine Tastaturausgabe benötigen.
-p $ ' prompt ' gibt die Eingabeaufforderung an, die zwischen $ 'und' liegen muss, um Leerzeichen und maskierte Zeichen zuzulassen. Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollarsymbol setzen, um maskierte Zeichen zu erhalten. Andernfalls können Sie einfache Anführungszeichen verwenden.
-d $ ' \ e ' gibt escappe als Trennzeichen an. Als endgültiges Zeichen für den aktuellen Eintrag können Sie also jedes beliebige Zeichen einfügen. Achten Sie jedoch darauf, ein Zeichen einzugeben, das der Benutzer eingeben kann.
-n 1 gibt an, dass nur ein einziges Zeichen benötigt wird.
-e gibt den Readline-Modus an.
-i $ ' Y ' gibt Y als Anfangstext im Readline-Modus an.
-t 5 gibt eine Zeitüberschreitung von 5 Sekunden an
Taste dient für den Fall, dass Sie die Eingabe kennen müssen, in -n1 Fall die Taste, die gedrückt wurde.
$? dienen dazu, den Exit-Code des letzten Programms zu kennen, zum Lesen, 142 im Falle einer Zeitüberschreitung, 0 korrekte Eingabe. $ Setzen? in einer Variablen so schnell wie möglich, wenn Sie sie nach einigen Befehlen testen müssen, weil alle Befehle $?
quelle
-s
;man read
undread --help
Hilfe hat unter Ubuntu 10.04.1 LTS nicht geholfen. Bearbeiten:help read
tat; ist der Rest veraltet?read: -i: invalid option
für die Ex.read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
auf #osxread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
funktioniert stattdessen für mich. `-i
funktioniert perfekt unter Ubuntu. Außerdem weiß ich nicht, wie es unter OSX-d
genauso funktioniert.read
ohne Parameter wird nur fortgesetzt, wenn Sie die Eingabetaste drücken. Der DOS-pause
Befehl wird fortgesetzt, wenn Sie eine beliebige Taste drücken. Verwendenread –n1
Sie diese Option, wenn Sie dieses Verhalten wünschen.quelle
Dies funktionierte für mich bei mehreren Linux-Varianten, bei denen einige dieser anderen Lösungen dies nicht taten (einschließlich der beliebtesten hier). Ich denke, es ist auch besser lesbar ...
Beachten Sie, dass eine Variable als Argument für angegeben werden muss
read
.quelle
read -n1
ist nicht tragbar. Ein tragbarer Weg, um dasselbe zu tun, könnte sein:Abgesehen von der Verwendung
read
können Sie nur eineENTER
Taste drücken, um fortzufahren:quelle
status=none
ist auch nicht tragbar. Leiten Sie stattdessen stdout und stderr nach / dev / null um.read -r line < /dev/tty
sein enought würde ENTER drücken ... .settings=$(stty -g); stty raw; dd ...; stty "$settings"
, um die tty-Einstellungen zu speichern und wiederherzustellen.tr
Bearbeitungssache auch funktionieren könnte?tr
die Ausgabe als Pipe gepuffert würde und Tastaturen außerhalb der USA Tasten haben, die Zeichen außerhalb des\1-\177
Bereichs senden .dd
ist der idiomatische Weg hier.Wenn Sie nur eine Schleife oder ein Skript anhalten müssen und anstelle einer beliebigen Taste die Eingabetaste drücken möchten,
read
erledigt dies die Aufgabe von alleine.Es ist nicht endbenutzerfreundlich, kann aber in Fällen ausreichen, in denen Sie ein schnelles Skript für sich selbst schreiben und es anhalten müssen, um etwas manuell im Hintergrund zu tun.
quelle
Versuche dies:
quelle
Diese Funktion funktioniert sowohl in
bash
alszsh
auch und stellt die E / A für das Terminal sicher:Legen Sie es in Ihre
.{ba,z}shrc
für große Gerechtigkeit!quelle
Ja zur Verwendung
read
- und es gibt einige Verbesserungen, die es sowohlcron
im Terminal als auch im Terminal am nützlichsten machen .Beispiel:
Mit dem -n 120 tritt nach 2 Minuten eine Zeitüberschreitung für die Leseanweisung auf, sodass sie nicht blockiert
cron
.Im Terminal dauert es 2 Minuten, um zu sehen, wie lange die
rsync
Ausführung des Befehls gedauert hat.Dann
echo
wird die nachfolgende Bash-Eingabeaufforderung in der nächsten Zeile angezeigt.Andernfalls wird es direkt nach "Weiter ..." in derselben Zeile angezeigt, wenn Enterim Terminal gedrückt wird.
quelle