J'ai un script shell bash dans lequel je voudrais interrompre l'exécution jusqu'à ce que l'utilisateur appuie sur une touche. Sous DOS, cela se fait facilement avec la commande "pause". Y a-t-il un équivalent Linux que je peux utiliser dans mon script?
Réponses
Trop de publicités?read
cette:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
L' -n1
indique qu'il attend pour un seul caractère. L' -r
le met en mode raw, ce qui est nécessaire car sinon, si vous appuyez sur quelque chose comme une barre oblique inverse, il n'a pas d'enregistrer jusqu'à ce que vous frappez la touche next (suivant). L' -p
spécifie l'invite de commandes, qui doivent être placés entre guillemets s'il contient des espaces. L' key
argument n'est nécessaire que si vous voulez savoir qui touche ils ont pressé, dans ce cas, vous pouvez avoir accès par l'entremise $key
.
Si vous utilisez bash, vous pouvez également spécifier un timeout avec -t
, ce qui provoque la lecture pour revenir un échec si une touche n'est pas pressée. Ainsi, par exemple:
read -t5 -n1 -r -p "Press any key in the next five seconds..." key
if [ $? -eq 0 ]; then
echo A key was pressed.
else
echo No key was pressed.
fi
J'utilise beaucoup ces moyens qui sont très courts, ils sont comme @theunamedguy et @Jim solutions, mais avec délai et mode silencieux en plus.
J'aime particulièrement le dernier cas et l'utiliser dans beaucoup de script en boucle, jusqu'à ce que l'utilisateur appuyez sur Entrée.
Les commandes
-
Entrez solution
read -rsp $'Press enter to continue...\n'
-
Toutes les clés de la solution (avec -n1)
read -rsp $'Press any key to continue...\n' -n1 key # echo $key
-
Délai d'expiration de la solution (avec -t5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n1 -t5;
-
Sommeil amélioré alias
read -rst0.5; timeout=$? # echo $timeout
Explication
-r spécifie le mode raw, qui ne permettent pas aux caractères combinés comme "\" ou "^".
-s spécifie le mode silencieux, et parce que nous n'avons pas besoin de clavier de sortie.
-p $'invite' spécifie l'invite de commandes, qui doivent être entre $ " et " laisser des espaces et des caractères d'échappement. Attention, vous devez le mettre entre guillemets simples avec des dollars symbole de bénéficier des caractères d'échappement, sinon vous pouvez utiliser de simples citations.
-n1 indique qu'il n'a besoin que d'un seul caractère.
-t5 spécifie un délai d'attente de 5 secondes
clé de servir dans le cas où vous avez besoin de savoir l'entrée, au -n1 cas, la touche qui a été pressée.
$? permet de connaître le code de sortie du dernier programme, pour lire, 142 en cas de timeout, 0 entrée correcte. Mettre $? dans une variable dès que possible si vous avez besoin de tester après quelques commandes, car toutes les commandes de la réécrire $?
read -n1
n'est pas portable. Un moyen portable de faire la même chose pourrait être:
(tty_state=$(stty -g) ; stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty
En plus de l'utilisation de read
, il suffit de cliquer sur ENTER
pour continuer l'invite:
sed -n q </dev/tty