Nur eine einzige Taste drücken
Hier ist ein längerer, aber wiederverwendbarer und modularer Ansatz:
- Gibt
0
\=ja und 1
\=nein zurück
- Kein Drücken von Enter erforderlich - nur ein einzelnes Zeichen
- Kann Enter drücken, um die Standardeinstellung zu akzeptieren
- Kann die Standardeinstellung deaktivieren, um eine Auswahl zu erzwingen
- Funktioniert sowohl für
zsh
als auch für bash
.
Voreinstellung auf "nein" beim Drücken von Enter
Beachten Sie, dass das N
großgeschrieben ist. Hier wird Enter gedrückt, um die Standardeinstellung zu akzeptieren:
$ confirm "Zeige gefährlichen Befehl" && echo "rm *"
Zeige gefährlichen Befehl [y/N]?
Beachten Sie auch, dass [y/N]?
automatisch hinzugefügt wurde. Das Standard-"nein" wird akzeptiert, also wird nichts ausgegeben.
Erneute Aufforderung, bis eine gültige Antwort gegeben wird:
$ confirm "Zeige gefährlichen Befehl" && echo "rm *"
Zeige gefährlichen Befehl [y/N]? X
Zeige gefährlichen Befehl [y/N]? y
rm *
Voreinstellung auf "ja" beim Drücken von Enter
Beachten Sie, dass das Y
großgeschrieben ist:
$ confirm_yes "Zeige gefährlichen Befehl" && echo "rm *"
Zeige gefährlichen Befehl [Y/n]?
rm *
Oben habe ich gerade Enter gedrückt, also wurde der Befehl ausgeführt.
Keine Voreinstellung bei Enter - erfordert y
oder n
$ get_yes_keypress "Hier kannst du nicht Enter drücken. Gefällt dir das [y/n]? "
Hier kannst du nicht Enter drücken. Gefällt dir das [y/n]? k
Hier kannst du nicht Enter drücken. Gefällt dir das [y/n]?
Hier kannst du nicht Enter drücken. Gefällt dir das [y/n]? n
$ echo $?
1
Hier wurde 1
oder falsch zurückgegeben. Beachten Sie, dass Sie bei dieser Low-Level-Funktion Ihren eigenen [y/n]?
-Prompt angeben müssen.
Code
# Liest ein einzelnes Zeichen von /dev/tty, mit der Eingabeaufforderung "$*"
# Hinweis: Durch Drücken von Enter wird eine leere Zeichenfolge zurückgegeben. Möglicherweise eine Version mit X am Ende, die dann im Aufrufer entfernt wird?
# Siehe https://unix.stackexchange.com/a/367880/143394 für den Umgang mit Multibyte usw.
function get_keypress {
local REPLY IFS=
>/dev/tty printf '%s' "$*"
[[ $ZSH_VERSION ]] && read -rk1 # Verwenden von -u0 zum Lesen von STDIN
# Siehe https://unix.stackexchange.com/q/383197/143394 bezüglich '\n' -> ''
[[ $BASH_VERSION ]] &&
# Verwendung: confirm "Gefahr. Bist du sicher?" && rm *
function confirm {
local prompt="${*:-Bist du sicher} [y/N]? "
get_yes_keypress "$prompt" 1
}
# Aufforderung zur Bestätigung, Standardeinstellung auf JA bei
function confirm_yes {
local prompt="${*:-Bist du sicher} [Y/n]? "
get_yes_keypress "$prompt" 0
}
40 Stimmen
Just als Hinweis: Die Konvention für Aufforderungen besagt, dass wenn Sie eine Option
[yn]
präsentieren, die Großschreibung die Standardeinstellung ist, d.h.[Yn]
wird standardmäßig auf "yes" und[yN]
auf "no" festgelegt. Siehe ux.stackexchange.com/a/40445/435324 Stimmen
Jeder, der von ZSH hierher kommt, siehe diese Antwort für die Verwendung des
read
Befehls zur Aufforderung2 Stimmen
Sie können auch meine zugehörige Frage/Antwort auf U&L.SE zur kanonischen Art, in
bash
zu pausieren, in Betracht ziehen. Die bereitgestellten Ergebnisse können einfach übertragen werden.