J'ai un script Bash Shell dans lequel je voudrais suspendre l'exécution jusqu'à ce que l'utilisateur appuie sur une touche. Sous DOS, cela s’accomplit facilement avec la commande "pause". Existe-t-il un équivalent Linux que je peux utiliser dans mon script?
read
fait ceci:
user@Host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@Host:~$
Le -n1
spécifie qu'il n'attend qu'un seul caractère. Le -r
le met en mode brut, ce qui est nécessaire car sinon, si vous appuyez sur une barre oblique inverse, il ne s'enregistre que lorsque vous appuyez sur la touche suivante. Le -p
spécifie l'invite, qui doit être citée si elle contient des espaces. L'argument key
n'est nécessaire que si vous voulez savoir sur quelle touche ils ont appuyé. Dans ce cas, vous pouvez y accéder via $key
.
Si vous utilisez Bash, vous pouvez également spécifier un délai d'expiration avec -t
, ce qui obligera read à renvoyer un échec lorsqu'une touche n'est pas enfoncée. Donc 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 méthodes qui sont très courtes et ressemblent à des solutions @theunamedguy et @Jim, mais avec un délai d'expiration et un mode silencieux en plus.
J'aime particulièrement le dernier cas et l'utilise dans de nombreux scripts qui s'exécutent en boucle jusqu'à ce que l'utilisateur appuie sur Enter.
Entrez la solution
read -rsp $'Press enter to continue...\n'
solution d'échappement (avec -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Toute solution clé (avec -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Question avec choix présélectionné (avec -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Solution de délai d'attente (avec -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
alias amélioré de sommeil
read -rst 0.5; timeout=$?
# echo $timeout
- r spécifie le mode brut, qui n'autorise pas les caractères combinés tels que "\" ou "^".
- s spécifie le mode silencieux, et parce que nous n’avons pas besoin de la sortie clavier.
- p $ ' Invite ' spécifie l'invite, qui doit être comprise entre $ 'et' pour laisser des espaces et des caractères d'échappement . Attention, vous devez mettre entre guillemets simples avec le symbole en dollars pour profiter des caractères échappés, sinon vous pouvez utiliser des guillemets simples.
- d $ '\e ' spécifie escappe en tant que caractère délimiteur, de sorte qu'un dernier caractère pour l'entrée en cours est possible mettre n'importe quel caractère mais veillez à mettre un caractère que l'utilisateur peut taper.
- n 1 indique qu'il n'a besoin que d'un seul caractère.
- e spécifie le mode readline.
- i $ 'Y' spécifie Y comme texte initial en mode de lecture abrégée.
- t 5 spécifie un délai d'attente de 5 secondes
touche servir si vous avez besoin de connaître l'entrée, dans le cas -n1, la touche sur laquelle vous avez appuyé.
$? sert à connaître le code de sortie du dernier programme, en lecture, 142 en cas de dépassement du délai d'attente, 0 entrée correcte. Mettez $? dans une variable dès que possible si vous avez besoin de la tester après quelques commandes, car toutes les commandes réécriraient $?
Cela a fonctionné pour moi sur plusieurs versions de Linux, à l’inverse de certaines de ces solutions (y compris les plus populaires ici). Je pense que c'est plus lisible aussi ...
echo Press enter to continue; read dummy;
Notez qu'une variable doit être fournie comme argument de read
.
read
sans paramètre ne continue que si vous appuyez sur entrée . La commande DOS pause
continue si vous appuyez sur une touche quelconque. Utilisez read –n1
si vous souhaitez ce comportement.
read -n1
n'est pas portable. Une façon portable de faire la même chose pourrait être:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
En plus d’utiliser read
, il suffit de presser ENTER
pour continuer. Vous pouvez faire ce qui suit:
sed -n q </dev/tty
Si vous avez juste besoin de mettre en pause une boucle ou un script et que vous êtes heureux d'appuyer sur Entrée au lieu de n'importe quelle touche, alors read
seul fera l'affaire.
do_stuff
read
do_more_stuff
Ce n'est pas convivial pour l'utilisateur final, mais cela peut être suffisant dans les cas où vous écrivez un script rapide pour vous-même, et vous devez le suspendre pour faire quelque chose manuellement à l'arrière-plan.
Essaye ça:
function pause(){
read -p "$*"
}
Cette fonction fonctionne à la fois avec bash
et zsh
et assure l’entrée/sortie du 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!
Oui, à l'aide de read
- et quelques modifications le rendent plus utile à la fois dans cron
et dans le terminal.
Exemple:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
L'option -n 120 expire l'instruction de lecture après 2 minutes afin qu'elle ne se bloque pas dans cron
name__.
En terminal, 2 minutes suffisent pour voir le temps d'exécution de la commande rsync
name__.
Ensuite, le nom suivant echo
est défini de manière à ce que l'invite bash suivante apparaisse sur la ligne suivante.
Sinon, il apparaîtra sur la même ligne directement après "continue ..." quand Enter est enfoncé dans le terminal.