it-swarm.com.de

Drücken Sie die Leertaste, um fortzufahren

Wie stoppe ich ein Bash-Skript, bis ein Benutzer gedrückt hat? Space?

Ich möchte die Frage in meinem Skript haben

Drücken Sie die Leertaste, um fortzufahren oder CTRL+C beenden

und dann sollte das Skript anhalten und warten, bis die Leertaste gedrückt wird.

84
rubo77

Sie können read verwenden:

read -n1 -r -p "Press space to continue..." 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
63

Die hier beschriebene Methode SO Q & A ist wahrscheinlich der beste Kandidat für eine Alternative zum pause -Verhalten, das Sie unter Windows beim Erstellen von BAT-Dateien gewohnt sind.

$ 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 Schlüssel.

$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$ 

Verweise

49
slm

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 dies überall in Ihrem Skript verwenden:

pause
9
rubo77
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 druckt jetzt eine Eingabeaufforderung ohne nachgestellte Zeilenumbruch, behandelt CTRL+C ruft stty zuverlässig nur so oft wie nötig auf und stellt die steuernde tty auf genau den Zustand wieder her, in dem stty sie gefunden hat. Einblick in man stty für Informationen zum expliziten Steuern von Echos, Steuerzeichen und allem.

Sie können dies auch 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önnten es mit ENTER tun, nein [ tests ] und nein stty wie:

sed -n q </dev/tty
6
mikeserv

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.

3
gcb

Die Einstellung 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
2
Robin A. Meade

Hier ist eine Methode, die sowohl in bash als auch in zsh funktioniert und die E/A für das Terminal sicherstellt:

# 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

Legen Sie es in Ihre .{ba,z}shrc für große Gerechtigkeit!

2
Tom Hale