web-dev-qa-db-fra.com

Arrêtez d'attendre la saisie de l'utilisateur

J'essaie de mettre en place un temps d'attente que l'utilisateur peut choisir de sauter en appuyant sur n'importe quelle touche. De plus, il ne doit rien imprimer sur le terminal car je l'utilise pour afficher une barre de progression. J'ai de la difficulté à saisir et à tester les entrées utilisateur, la difficulté supplémentaire ne devant pas induire plus de retard dans le temps d'attente total.

Voici ce que j'ai en ce moment:

read -t 0 input </dev/tty1
   if [[ $input -ne "" ]]; then
exit 0
fi

Et c'est à l'intérieur d'une boucle qui met à jour la barre de progression. Il réussit à ne pas ajouter plus de retard ou à imprimer des lignes indésirables mais il ne remplit pas sa fonction.

-t 0 pour ne pas ajouter de délai supplémentaire

lecture de "/ dev/tty1" pour ne pas ajouter de lignes indésirables

Comment puis-je atteindre cet objectif ?

1
Adrien Horgnies

Croyez-le ou non, c'est le zéro qui vous dérange. Si vous le changez pour un nombre très bas comme .01, cela fonctionnera. Vous pouvez le diffuser encore plus loin comme ceci:

if $(read -t.01 -sn1); then exit 0; fi
2
bashBedlam

Vous souhaitez exécuter deux choses en parallèle.

  1. Lire l'entrée en attente 5 secondes (par exemple)
  2. Mettre à jour la barre de progression (indiquant que 5 secondes se terminent)

Pour ce faire, ne placez pas la commande read dans la boucle.

Au lieu de cela, faites quelque chose comme ceci:

for i in {1..10}; do sleep 0.5s; echo ${i}0; done | zenity --progress --auto-close --text="waiting for input...5sec" 2>/dev/null &  
read -t 5 asd && kill $!

(mettez les deux lignes ci-dessus dans un fichier (disons abc.sh) et exécutez-le bash abc.sh)

Explication:

La première commande (pour mettre à jour la barre de progression) est envoyée en arrière-plan avec & . Si la commande read est terminée en premier, kill $! fermera la barre de progression.

Remarque: Checkout GNU Parallel . Cela vous aiderait à faire plus de choses en parallèle.

1
Severus Tux