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?
read
macht das:
[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$
Der -n1
gibt an, dass nur auf ein einzelnes Zeichen gewartet wird. Der -r
versetzt ihn in den Raw-Modus, was notwendig ist, da sich sonst, wenn Sie so etwas wie einen Backslash drücken, erst nach dem Drücken der nächsten Taste registriert. Der -p
gibt die Aufforderung 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 mit -t
auch ein Timeout angeben, das dazu führt, dass Read einen Fehler zurückgibt, wenn keine Taste 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
Ich benutze diese Methoden oft sehr kurz und sie ähneln @theunamedguy- und @Jim-Lösungen, aber zusätzlich mit Timeout und Silent-Modus.
Ich liebe besonders den letzten Fall und benutze ihn in vielen Skripten, die in einer Schleife laufen, bis der Benutzer drückt Enter.
Lösung eingeben
read -rsp $'Press enter to continue...\n'
Fluchtlösung (mit -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Beliebige Schlüssellösung (mit -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Frage mit vorausgewählter Auswahl (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;
Sleep enhanced alias
read -rst 0.5; timeout=$?
# echo $timeout
- r gibt den Rohmodus an, der keine kombinierten Zeichen wie "\" oder "^" zulässt.
- s spezifiziert den stillen Modus und weil wir keine Tastaturausgabe benötigen.
- p $ ' Eingabeaufforderung ' gibt die Eingabeaufforderung an, die zwischen $ 'und' liegen muss, um Leerzeichen und Escapezeichen zuzulassen . Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollarsymbol setzen, um die entkoppelten Zeichen zu unterstützen. Andernfalls können Sie einfache Anführungszeichen verwenden.
- d $ '\e ' spezifiziert escappe als Trennzeichen, so dass dies als abschließendes Zeichen für die aktuelle Eingabe möglich ist um ein beliebiges Zeichen zu setzen, aber seien Sie vorsichtig, um ein Zeichen zu setzen, das der Benutzer eingeben kann.
- n 1 gibt an, dass nur ein einzelnes 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 dienen 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 bei Timeout, 0 richtige Eingabe. $ Setzen? in einer Variablen so schnell wie möglich, wenn Sie es nach einigen Befehlen testen müssen, weil alle Befehle $?
Dies funktionierte für mich bei mehreren Linux-Varianten, bei denen einige dieser anderen Lösungen nicht vorhanden waren (einschließlich der beliebtesten hier). Ich finde es auch lesbarer ...
echo Press enter to continue; read dummy;
Beachten Sie, dass eine Variable als Argument für read
angegeben werden muss.
read
ohne Parameter wird nur fortgesetzt, 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 wünschen.
read -n1
ist nicht portabel. Ein tragbarer Weg, das Gleiche zu 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 der Verwendung von read
können Sie durch Drücken von ENTER
fortfahren.
sed -n q </dev/tty
Wenn Sie nur eine Schleife oder ein Skript anhalten müssen und Sie statt einer beliebigen Taste die Eingabetaste drücken, erledigt read
die Aufgabe.
do_stuff
read
do_more_stuff
Es ist nicht für den Endbenutzer geeignet, kann aber ausreichend sein, wenn Sie ein schnelles Skript für sich selbst schreiben und es unterbrechen müssen, um manuell etwas im Hintergrund zu tun.
Versuche dies:
function pause(){
read -p "$*"
}
Diese Funktion arbeitet sowohl in bash
als auch in zsh
und gewährleistet die E/A des Terminals:
# Prompt for a keypress to continue. Customise Prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
Setzen Sie es in Ihren .{ba,z}shrc
für Große Gerechtigkeit!
Ja, um read
zu verwenden - und es gibt ein paar Verbesserungen, die es sowohl in cron
als auch im Terminal am nützlichsten machen.
Beispiel:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
Das -n 120 bewirkt eine Zeitüberschreitung der Leseanweisung nach 2 Minuten, sodass cron
nicht blockiert wird.
Im Terminal werden 2 Minuten benötigt, um festzustellen, wie lange die Ausführung des Befehls rsync
gedauert hat.
Dann ist der nachfolgende echo
so, dass die nachfolgende Bash-Eingabeaufforderung in der nächsten Zeile angezeigt wird.
Andernfalls wird es in derselben Zeile direkt nach "Weiter ..." angezeigt, wenn Enter wird im Terminal gedrückt.