Ich habe ein Bash-Shell-Skript, in dem ich die Ausführung anhalten möchte, bis der Benutzer eine Taste drückt. In DOS ist dies mit dem Befehl "pause" problemlos möglich. Gibt es ein Linux-Äquivalent, das ich in meinem Skript verwenden kann?Was ist das Linux-Äquivalent zu DOS-Pause?
Antwort
read
tut dies:
[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$
Die -n1
gibt an, dass es nur für ein einzelnes Zeichen wartet. Die -r
bringt es in den Raw-Modus, der notwendig ist, weil sonst, wenn Sie etwas wie Backslash drücken, es nicht registriert wird, bis Sie die nächste Taste drücken. Die -p
gibt die Eingabeaufforderung an, die in Anführungszeichen gesetzt werden muss, wenn sie Leerzeichen enthält. Das Argument key
ist nur erforderlich, wenn Sie wissen möchten, welche Taste gedrückt wurde. In diesem Fall können Sie über $key
darauf zugreifen.
Wenn Sie Bash verwenden, können Sie auch eine Zeitüberschreitung mit -t
angeben. Dadurch wird beim Lesen ein Fehler zurückgegeben, wenn keine Taste gedrückt wird. So 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
read
ohne Parameter nur dann weiter, wenn Sie die Eingabetaste drücken. Der Befehl DOS pause
wird fortgesetzt, wenn Sie eine beliebige Taste drücken. Verwenden Sie read –n1
, wenn Sie dieses Verhalten möchten.
Ich benutze diese Möglichkeiten eine Menge, die sehr kurz sind, und sie sind wie @theunamedguy und @Jim-Lösungen, aber mit Timeout und Silent-Modus zusätzlich.
Ich liebe besonders den letzten Fall und benutze es in vielen Skripten, die in einer Schleife laufen, bis der Benutzer Enter drückt.
Befehle
eingeben Lösung
read -rsp $'Press enter to continue...\n'
Flucht Lösung(mit -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Jede Taste Lösung(mit -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key # echo $key
Frage mit vorgewählten Wahl(mit -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key; # echo $key
Timeout Lösung(mit -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Schlaf verbessert alias
read -rst 0.5; timeout=$? # echo $timeout
Erklärung
-r gibt Raw-Modus, die es erlauben, nicht kombinierten Zeichen wie "\" oder „^ ".
-s gibt stillen Modus an, und da wir keine Tastaturausgabe benötigen.
-p $ 'Prompt ' gibt die Eingabeaufforderung, die zwischen $' und' lassen Räume und Escape-Zeichen sein muß. Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollar-Symbol setzen, um entkernte Zeichen zu nutzen, ansonsten können Sie einfache Anführungszeichen verwenden.
-d $ ‚\ e‘ gibt escappe als Trennzeichen charater, so als letztes Zeichen für aktuellen Eintrag, das möglich ist, jedes Zeichen zu setzen, aber vorsichtig sein, um ein Zeichen zu setzen, dass der Benutzer eingeben kann.
-n gibt an, dass nur ein einzelnes Zeichen benötigt wird.
-e spezifiziert den Readline-Modus.
-i $ 'Y' gibt Y als Anfang Text in Readline- Modus.
-t legt ein Timeout von 5 Sekunden
Schlüssel im Fall dienen müssen Sie den Eingang wissen, in -n1 Fall die Taste, die gedrückt wurde.
$? dienen dazu, den Exit-Code des letzten Programms zu lesen, 142 im Falle eines Timeouts, 0 korrekten Eingang. Setzen Sie $? in einer Variablen so schnell wie möglich, wenn Sie es nach Somes Befehle testen müssen, weil alle Befehle $ überschreiben würden?
+1 zur Erläuterung von '-s'; 'man read' und' read --help' helfen nicht bei Ubuntu 10.04.1 LTS. Edit: 'Hilfe lesen' tat; Ist der Rest veraltet? –
1+ für die große Erklärung: aber ich habe 'lesen: -i: ungültige Option' für die ex. 'read -rp $ 'Sind Sie sicher (Y/n):' -ei $ 'Y' Schlüssel;' auf #osx 'lesen -rp $ 'kill-server: Sind Sie sicher (Y/n):' -d $ 'Y' Taste; 'funktioniert stattdessen für mich. ' –
Ich weiß nicht, wie es auf OSX funktioniert, aber ich habe einige Tests gemacht und' -i' funktioniert perfekt auf Ubuntu, auch ich weiß nicht, wie wenn '-d' auf OSX die gleiche Weise funktioniert. –
read -n1
ist nicht tragbar. Ein tragbarer Weg, um das gleiche tun könnte sein:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Neben read
unter Verwendung von nur einer Presse ENTER
prompt weiter Sie tun könnten:
sed -n q </dev/tty
'status = none' ist auch nicht tragbar. Leiten Sie stattdessen stdout und stderr nach/dev/null um. 'read -r line dev/tty' würde ausreichen für _press ENTER ..._. –
@StephaneChezales danke - ich wusste das nicht. ich werde es jetzt reparieren. Danke nochmal - behoben. Sie sind übrigens ein bodenloser Brunnen wertvoller Informationen. – mikeserv
Beachten Sie auch die 'settings = $ (stty -g); steinig roh; dd ...; stty "$ settings" 'um die Einstellungen zu speichern und wiederherzustellen. –
Wenn Sie nur eine Schleife oder ein Skript muss pausieren , und Sie drücken die Eingabetaste statt einer beliebigen Taste, dann wird read
allein die Aufgabe übernehmen.
Dies funktionierte für mich auf mehreren Varianten von Linux, wo einige dieser anderen Lösungen nicht (einschließlich der beliebtesten hier). Ich denke, es ist auch lesbar ...
echo Press enter to continue; read dummy;
Beachten Sie, dass eine Variable als Argument an read
geliefert werden muss.
Vor 8 Jahren gepostet. Im Juli 2017 war das, was ich wollte. Vielen Dank. – SDsolar
diese Antwort löst mein Problem, wenn ich diese Zeile kopiere und füge und aus irgendeinem Grund habe ich mehr Zeilen angehängt, die angehängten Zeilen werden nicht ausgeführt, wie war mit DOS Pause –
Streng genommen wäre das "" Geben Sie ein beliebiges Nicht-NUL-Zeichen ein, um fortzufahren "'. Einige Tasten senden kein Zeichen (wie 'Ctrl' ...) und manche senden mehr als eins (wie' F1', 'Home' ...). 'bash' ignoriert NUL-Zeichen. –
Wie cool. Dies wurde vor 8 Jahren und 9 Monaten gepostet und kam im Juli 2017 direkt in meine Google-Suche. Genau das, was ich brauchte! – SDsolar