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é.
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
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
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...
$
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
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
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.
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
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!