web-dev-qa-db-fra.com

appuyez sur la touche Espace pour continuer

Comment arrêter un script bash jusqu'à ce qu'un utilisateur appuie sur Space?

J'aimerais avoir la question dans mon script

Appuyez sur espace pour continuer ou CTRL+C pour quitter

puis le script doit s'arrêter et attendre que Espace soit enfoncé.

84
rubo77

Vous pouvez utiliser read:

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

La méthode décrite dans ce SO Q&A est probablement le meilleur candidat pour une alternative au comportement pause que vous êtes habitué à Windows lorsque vous faites des fichiers BAT.

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

Exemple

Ici, je lance ce qui précède et j'appuie simplement sur n'importe quelle touche, dans ce cas, le D clé.

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

Références

49
slm

Vous pouvez lui créer une fonction:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

Ensuite, vous pouvez l'utiliser partout dans votre script:

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"

Cela affiche maintenant une invite sans retour à la ligne, gère CTRL+C de manière fiable, n'appelle stty que aussi souvent que nécessaire et restaure le tty de contrôle exactement dans l'état dans lequel stty l'a trouvé. Examinez man stty pour savoir comment contrôler explicitement les échos, contrôler les caractères et tout.

Vous pouvez également faire ceci:

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

Vous pouvez le faire avec ENTER, non [ tests ] et non stty comme:

sed -n q </dev/tty
6
mikeserv

paresseux une doublure:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

l'inconvénient est que vous perdez le contrôle lorsque l'utilisateur appuie sur ctrl + c. Dans ce cas, le script se terminera toujours avec le code 130.

3
gcb

Les paramètres IFS pour une chaîne vide suppriment le comportement par défaut de lecture de la suppression des espaces blancs.

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

MISE À JOUR 2018-05-23: Nous pouvons simplifier cela en utilisant la variable REPLY, qui n'est pas soumise au fractionnement de Word:

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

Voici une méthode qui fonctionne à la fois dans bash et zsh, et assure les E/S vers le terminal:

# 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

Mettez-le dans votre .{ba,z}shrc pour Great Justice!

2
Tom Hale