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 ?
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
Vous souhaitez exécuter deux choses en parallèle.
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.