Appuyez sur espace pour continuer

Comment arrêter un script bash jusquà ce quun utilisateur ait appuyé sur Espace ?

Je voudrais avoir la question dans mon script

Appuyez sur espace pour continuer ou CTRL + C pour quitter

puis le script doit sarrêter et attendre jusquà ce que lespace soit pressé.

Commentaires

Réponse

Vous pouvez utiliser read:

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 

Remplacez " " pour lespace ci-dessus par "" pour la touche Entrée, $"\t" pour la touche Tab.

Commentaires

  • Vous devez ajouter -s à pour ne pas imprimer le caractère pressé sur le terminal. Et ajoutez un saut de ligne à la fin, ou la sortie continuera directement dans la même ligne que la question. Le mieux serait: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Ce script ne ‘ t fonctionne pas. Je viens de le tester sur Red Hat Linux … Le bloc else sexécute toujours, même lorsque la barre despace est enfoncée.
  • @robert It ‘ parce que vous ‘ nutilisez pas bash. Cela fonctionne si vous utilisez à la place read _, si vous avez un autre shell que bash.
  • Le '' contient un espace à lintérieur?
  • Cela se lit depuis STDIN, ce qui causera des problèmes donnés pipeline | script.sh Voir cette réponse pour une solution.

Réponse

La méthode discuté dans ce SO Q & A est probablement le meilleur candidat pour une alternative au comportement pause auquel vous « êtes habitué sous Windows lorsque faire des fichiers BAT.

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

Exemple

Ici, jexécute ce qui précède, puis jappuie simplement sur nimporte quelle touche, dans ce cas le Touche D .

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

Références

Commentaires

  • Je veux dire pourquoi le $ avant re la chaîne ici: -rsp $'Press?
  • @ rubo77 – ah. Voici ‘ comment créer une chaîne littérale avec des caractères spéciaux. Il ‘ est de la forme: $ ‘ … ‘
  • @ rubo77 – que ‘ est différent. ‘ est un signe dollar avec des guillemets doubles, jai utilisé un dollar avec des guillemets simples. Veuillez supprimer ce commentaire, il ‘ est faux.
  • Ah, je comprends. Au cas où vous mettriez des séquences échappées dans la chaîne dinvite. voir wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – oui cette notation permet dinclure des séquences déchappement sans aucune echo -e "..." lignes supplémentaires. Il ‘ est beaucoup plus compact dans ces situations.

Réponse

Vous pouvez créer une fonction pour cela:

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

Ensuite, vous pouvez lutiliser partout dans votre script:

pause 

Commentaires

  • si vous êtes nouveau dans le script shell – vous devez mettre la fonction en haut de votre script avant de lutiliser

Réponse

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" 

Ceci imprime maintenant une invite sans nouvelle ligne de fin, gère CTRL+C de manière fiable, invoque stty aussi souvent que nécessaire, et rétablit le terminal de contrôle à exactement létat dans lequel stty la trouvé. Consultez 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, sans [ tests ] et sans stty comme:

sed -n q </dev/tty 

Commentaires

  • Vos deux dernières solutions semblent fonctionner correctement avec /bin/sh (par exemple sur FreeBSD) aussi, pas seulement avec bash.
  • est votre réponse sur SO équivalent, ou même mieux?

Réponse

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!

Réponse

lazy one liner:

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

linconvénient est que vous perdez le contrôle lorsque lutilisateur appuie sur ctrl + c. Le script se terminera toujours avec le code 130 dans ce cas.

Répondez

Paramètres IFS à la chaîne vide supprime le comportement par défaut de read en matière de réduction 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 23/05/2018: Nous pouvons simplifier cela en utilisant la variable REPLY, qui nest pas sujette au fractionnement de mots:

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 

Réponse

Voici « une solution simple de Appuyez sur ESPACE pour continuer (pas ENTRER)

read -s -d " "

Cela attendra que vous appuyiez sur la barre despace. Oui, seulement la barre despace, elle ne se briserait pas si vous appuyiez sur Entrée.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *