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
- Tout cela et plus encore est traité dans ce SO Q & A BTW: Quel est léquivalent Linux en pause DOS?
- Voir aussi: Suspendre le script Shell jusquà ce que Appuyez sur Entrée dans la boucle while
- associé: unix.stackexchange.com/questions/293940/…
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 placeread _
, si vous avez un autre shell quebash
. - 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.