Drücken Sie die Leertaste, um fortzufahren.

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

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 stattdessen read _ verwenden, wenn Sie eine andere Shell als bash 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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.