Wie halte ich ein Bash-Skript an, bis ein Benutzer gedrückt hat Space?
Ich hätte die Frage gerne in meinem Skript
Drücken Sie die Leertaste, um fortzufahren, oder CTRL+, Cum den Vorgang zu beenden
und dann sollte das Skript anhalten und warten, bis die Leertaste gedrückt wird.
bash
control-flow
rubo77
quelle
quelle
Antworten:
Sie können verwenden
read
:quelle
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
Block wird immer ausgeführt, auch wenn die Leertaste gedrückt wird.bash
. Es funktioniert, wenn Sieread _
stattdessen eine andere Shell als verwendenbash
.''
einen Raum enthalten?''
für eine leere Zeichenfolge. Kein Platz drinnen. Ich denke, es passt auch, wenn Sie ENTER oder TABDie in dieser SO-Frage und Antwort beschriebene Methode ist wahrscheinlich der beste Kandidat für eine Alternative zu dem
pause
Verhalten, das Sie unter Windows bei der Ausführung von BAT-Dateien gewohnt sind.Beispiel
Hier führe ich das Obige aus und drücke dann einfach eine beliebige Taste, in diesem Fall die DTaste.
Verweise
quelle
$
vor der Zeichenfolge hier-rsp $'Press
:?echo -e "..."
Zeilen. In solchen Situationen ist es viel kompakter.Dies druckt nun eine Eingabeaufforderung ohne nachfolgende Zeile, verarbeitet sie
CTRL+C
zuverlässig, ruft siestty
nur so oft auf, wie es erforderlich ist, und stellt den Status der Steuerung genau auf den Zustand zurück, in dem siestty
gefunden wurde. Suchen Sie nachman stty
Informationen zum expliziten Steuern von Echos, Steuerzeichen und allem.Das könnten Sie auch tun:
Du könntest es mit
ENTER
, ohne[
Tests]
und ohnestty
wie machen:quelle
Sie könnten eine Funktion dafür erstellen:
Dann können Sie dies überall in Ihrem Skript verwenden:
quelle
Lazy One Liner:
Der Nachteil ist, dass Sie die Kontrolle verlieren, wenn der Benutzer Strg + C drückt. In diesem Fall wird das Skript immer mit Code 130 beendet.
quelle
Die Einstellung "
IFS
leere Zeichenfolge" unterdrückt das Standardverhalten von read beim Zuschneiden von Leerzeichen.UPDATE 2018-05-23: Wir können dies vereinfachen, indem wir die Variable REPLY verwenden, die keiner Wortteilung unterliegt:
quelle
Hier ist ein Weg, der in beiden Werken
bash
undzsh
und sorgt für I / O an das Terminal:Setzen Sie es in Ihr
.{ba,z}shrc
für große Gerechtigkeit ein!quelle