Réponses:
read
est ce que ca:
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 le -r
met en mode brut, ce qui est nécessaire car sinon, si vous appuyez sur quelque chose comme 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' key
argument n'est nécessaire que si vous voulez savoir sur quelle touche ils ont appuyé, auquel cas vous pouvez y accéder $key
.
Si vous utilisez Bash, vous pouvez également spécifier un délai d'expiration avec -t
, ce qui provoque l'échec de la lecture lorsqu'une touche n'est pas enfoncé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
Press a key to continue...
même les utilisateurs novices pourront trouver la a
clé et appuyer dessus; o)
command | myscript.sh
ou myscript.sh | command
. Voir cette réponse pour une solution.
read: 1: read: Illegal option -n
assurez-vous d'encapsuler votre commande, bash -c 'command && command'
etc., car cette erreur provient probablement de sh
. Je fais cela dans une commande wrapper Lando.
J'utilise beaucoup ces méthodes qui sont très courtes, et elles sont comme les solutions @theunamedguy et @Jim, mais avec le timeout et le 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 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 temporisation (avec -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Alias amélioré pour le sommeil
read -rst 0.5; timeout=$?
# echo $timeout
-r spécifie le mode brut, qui n'autorise pas les caractères combinés comme "\" ou "^".
-s spécifie le mode silencieux, et parce que nous n'avons pas besoin de sortie clavier.
-p $ ' prompt ' 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 dollars pour bénéficier des caractères échappés, sinon vous pouvez utiliser des guillemets simples.
-d $ ' \ e ' spécifie escappe comme caractère de délimitation, donc comme caractère final pour l'entrée courante, il est possible de mettre n'importe quel caractère mais attention à mettre un caractère que l'utilisateur peut taper.
-n 1 spécifie qu'il n'a besoin que d'un seul caractère.
-e spécifie le mode de ligne de lecture.
-i $ ' Y ' spécifie Y comme texte initial en mode readline.
-t 5 spécifie un délai d'expiration de 5 secondes
touche servir au cas où vous auriez besoin de connaître l'entrée, dans le cas -n1, la touche qui a été pressée.
$? servir à connaître le code de sortie du dernier programme, pour lecture, 142 en cas de timeout, 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 $?
-s
; man read
et l' read --help
aide n'a pas aidé sur Ubuntu 10.04.1 LTS. Edit: help read
did; le reste est-il déconseillé?
read: -i: invalid option
pour l'ex. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
sur #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
fonctionne pour moi à la place. `
-i
fonctionne parfaitement sur Ubuntu, je ne sais pas non plus comment cela -d
fonctionne de la même manière sur OSX.
Cela a fonctionné pour moi sur plusieurs versions de Linux, où certaines de ces autres solutions ne fonctionnaient pas (y compris les plus populaires ici). Je pense que c'est aussi plus lisible ...
echo Press enter to continue; read dummy;
Notez qu'une variable doit être fournie comme argument à read
.
read -n1
n'est pas portable. Une façon portable de faire de même 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
, pour juste une pression sur ENTER
pour continuer, vous pouvez faire:
sed -n q </dev/tty
status=none
n'est pas portable non plus. Redirigez plutôt stdout et stderr vers / dev / null. read -r line < /dev/tty
serait enought pour appuyer sur ENTRER ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
pour enregistrer et restaurer les paramètres tty.
tr
édition pourrait également fonctionner?
tr
cela tamponnerait sa sortie comme un canal, et les claviers non américains ont des touches qui envoient des caractères en dehors de la \1-\177
plage. dd
est la voie idiomatique ici.
Si vous avez juste besoin de suspendre une boucle ou un script, et que vous êtes heureux d'appuyer sur Entrée au lieu d'une touche, alors read
à lui seul fera le travail.
do_stuff
read
do_more_stuff
Il n'est pas convivial pour l'utilisateur final, mais peut être suffisant dans les cas où vous écrivez un script rapide pour vous-même, et vous devez le mettre en pause pour faire quelque chose manuellement en arrière-plan.
Essaye ça:
function pause(){
read -p "$*"
}
Cette fonction fonctionne à la fois sur 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
for Great Justice!
Oui à l'utilisation read
- et il y a quelques réglages qui le rendent plus utile à la fois cron
et dans le terminal.
Exemple:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
Le -n 120 fait expirer l'instruction de lecture après 2 minutes afin qu'il ne se bloque pas cron
.
Dans le terminal, il donne 2 minutes pour voir combien de temps la rsync
commande a pris pour s'exécuter.
Ensuite, le suivant echo
est donc l'invite bash suivante apparaîtra sur la ligne suivante.
Sinon, il s'affichera sur la même ligne directement après "continuer ..." lorsque vous Enterappuyez sur dans le terminal.
"Enter any non-NUL character to continue"
. Certaines touches n'envoient aucun caractère (commeCtrl
...) et certaines en envoient plus d'un (commeF1
,Home
...).bash
ignore les caractères NUL.