Wie stoppe ich ein Bash-Skript, bis ein Benutzer die Leertaste gedrückt hat?
Ich möchte die Frage in meinem Skript haben.
Drücken Sie die Leertaste, um fortzufahren, oder STRG + C um
zu beenden, sollte das Skript anhalten und warten, bis die Leertaste gedrückt wird.
Kommentare
- All dies und mehr wird in diesem SO Q behandelt. & A Übrigens: Was ist das Linux-Äquivalent? zu DOS-Pause?
- Siehe auch: Shell-Skript anhalten, bis die Eingabetaste gedrückt wird
- Verwandte: unix.stackexchange.com/questions/293940/…
Antwort
Sie können read
verwenden:
read -n1 -s -r -p $"Press space to continue...\n" key if [ "$key" = " " ]; then # Space pressed, do something # echo [$key] is empty when SPACE is pressed # uncomment to trace else # Anything else pressed, do whatever else. # echo [$key] not empty fi
Ersetzen Sie " "
durch ""
für Eingabetaste, $"\t"
für Tabulatortaste.
Kommentare
- Sie sollten -s hinzufügen, um das gedrückte Zeichen nicht auf dem Terminal auszudrucken. Fügen Sie am Ende einen Zeilenumbruch hinzu, oder die Ausgabe wird direkt in derselben Zeile wie die Frage fortgesetzt. Am besten wäre:
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
- Dieses Skript funktioniert nicht ‚. Habe es gerade unter Red Hat Linux getestet … Der Block
else
wird immer ausgeführt, auch wenn die Leertaste gedrückt wird. - @robert It ‚ s, weil Sie ‚ nicht
bash
verwenden. Es funktioniert, wenn Sie stattdessenread _
verwenden, wenn Sie eine andere Shell alsbash
haben. - Sollte das
''
enthält ein Leerzeichen im Inneren? - Dies liest aus STDIN, was zu Problemen führen wird, wenn
pipeline | script.sh
Siehe diese Antwort für eine Lösung.
Antwort
Die Methode & A ist wahrscheinlich der beste Kandidat für eine Alternative zu dem Verhalten pause
, an das Sie unter Windows gewöhnt sind, wenn BAT-Dateien ausführen.
$ read -rsp $"Press any key to continue...\n" -n1 key
Beispiel
Hier führe ich das oben genannte aus und drücke dann einfach eine beliebige Taste, in diesem Fall die D -Taste.
$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $
Referenzen
Kommentare
- Ich meine, warum die
$
befo Hier ist die Zeichenfolge:-rsp $'Press
? - @ rubo77 – ah. So ‚ können Sie eine Literalzeichenfolge mit Sonderzeichen erstellen. Es hat ‚ die Form: $ ‚ … ‚
- @ rubo77 – das ‚ ist anders. Das ‚ ist ein Dollarzeichen mit doppelten Anführungszeichen. Ich habe einen Dollar mit einfachen Anführungszeichen verwendet. Bitte löschen Sie diesen Kommentar, es ist ‚ falsch.
- Ah, ich verstehe. Falls Sie maskierte Sequenzen in die Eingabeaufforderungszeichenfolge einfügen. siehe wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
- @ rubo77 – ja, diese Notation ermöglicht das Einfügen von Escape-Sequenzen ohne zusätzliche
echo -e "..."
Zeilen. ‚ ist in solchen Situationen viel kompakter.
Antwort
Sie können eine Funktion dafür erstellen:
pause(){ read -n1 -rsp $"Press any key to continue or Ctrl+C to exit...\n" }
Dann können Sie diese überall in Ihrem Skript verwenden:
pause
Kommentare
- Wenn Sie mit Shell-Skripten noch nicht vertraut sind, müssen Sie die Funktion vor der Verwendung an die Spitze Ihres Skripts setzen
Antwort
hold=" " printf "Press "SPACE" to continue or "CTRL+C" to exit : " tty_state=$(stty -g) stty -icanon until [ -z "${hold#$in}" ] ; do in=$(dd bs=1 count=1 </dev/tty 2>/dev/null) done stty "$tty_state"
Dies gibt jetzt eine Eingabeaufforderung ohne nachfolgende Zeilenumbruch aus. behandelt CTRL+C
zuverlässig, ruft stty
nur so oft wie nötig auf und stellt die steuernde tty auf genau den Zustand wieder her, in dem stty
hat es gefunden. In man stty
finden Sie Informationen zum expliziten Steuern von Echos, Steuerzeichen und allem.
Sie können auch Folgendes tun:
printf "Press any key to continue or "CTRL+C" to exit : " (tty_state=$(stty -g) stty -icanon LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1 stty "$tty_state" ) </dev/tty
Sie können dies mit ENTER
tun, keine [
Tests ]
und keine stty
wie:
sed -n q </dev/tty
Kommentare
- Ihre beiden letzten Lösungen scheinen auch mit
/bin/sh
(z. B. unter FreeBSD) gut zu funktionieren, nicht nur mit bash. - ist Ihre Antwort auf SO äquivalent oder noch besser?
Antwort
Hier „ist eine Methode, die in beiden bash
und zsh
und stellt die E / A für das Terminal sicher:
# 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
Geben Sie sie in Ihre .{ba,z}shrc
für große Gerechtigkeit!
Antwort
fauler Einzeiler:
echo "Press any key to continue or Ctrl+C to cancel" read && do_something.sh
Der Nachteil ist, dass Sie die Kontrolle verlieren, wenn der Benutzer Strg + C drückt. In diesem Fall wird das Skript immer mit dem Code 130 beendet.
Antwort
Einstellungen IFS
zum Leeren der Zeichenfolge unterdrückt das Standardverhalten des Lesens beim Trimmen von Leerzeichen.
try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do # Set IFS to empty string so that read doesn"t trim # See http://mywiki.wooledge.org/BashFAQ/001#Trimming IFS= read -n1 -r key [[ $key == " " ]] && break done echo echo "Continuing ..." } try_this
UPDATE 2018-05-23: Wir können dies vereinfachen, indem wir die Variable REPLY verwenden, die keiner Wortaufteilung unterliegt:
try_this() { echo -n "Press SPACE to continue or Ctrl+C to exit ... " while true; do read -n1 -r [[ $REPLY == " " ]] && break done echo echo "Continuing ..." } try_this
Antwort
Hier ist eine einfache Lösung von Drücken Sie die Leertaste, um fortzufahren (nicht ENTER)
read -s -d " "
Dies wartet, bis Sie die Leertaste drücken. Ja, nur die Leertaste, sie würde nicht brechen, wenn Sie die Eingabetaste drücken.