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
"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.Press a key to continue...
même les utilisateurs novices pourront trouver laa
clé et appuyer dessus; o)command | myscript.sh
oumyscript.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 desh
. 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.
Commandes
Entrez la solution
Solution d'échappement (avec -d $ '\ e')
Toute solution clé (avec -n 1)
Question avec choix présélectionné (avec -ei $ 'Y')
Solution de temporisation (avec -t 5)
Alias amélioré pour le sommeil
Explication
-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 $?
la source
-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 #osxread -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.read
sans aucun paramètre ne continuera que si vous appuyez sur Entrée. Lapause
commande DOS continuera si vous appuyez sur n'importe quelle touche. À utiliserread –n1
si vous souhaitez ce comportement.la source
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 ...
Notez qu'une variable doit être fournie comme argument à
read
.la source
read -n1
n'est pas portable. Une façon portable de faire de même pourrait être:En plus d'utiliser
read
, pour juste une pression surENTER
pour continuer, vous pouvez faire:la source
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.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.
la source
Essaye ça:
la source
Cette fonction fonctionne à la fois sur
bash
etzsh
et assure les E / S vers le terminal:Mettez-le dans votre
.{ba,z}shrc
for Great Justice!la source
Oui à l'utilisation
read
- et il y a quelques réglages qui le rendent plus utile à la foiscron
et dans le terminal.Exemple:
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.
la source