Ordre d’exécution du script Bash, pourquoi met-il en queue la commande de lecture?

Je suis très confus en ce moment.

Ce que je veux faire, c’est créer une fonction d’écouteur, qui attend deux commandes – le fait est qu’elle ne doit écouter que toutes les deux cent millisecondes et ignorer les autres entrées de l’utilisateur.

function foo() { read -sN1 _input case "${_input}" in A) echo 'Option A';; B) echo 'Option B';; esac } while true; do sleep 0.2 foo done 

Si je “martèle” la clé A (ou la touche UP) dix fois, il écrit “Option A” dix fois (bien que lentement) – alors qu’il ne devrait avoir que le temps de l’écrire au maximum trois fois. Pourquoi est-ce – et comment puis-je le réparer?

Votre terminal met en mémoire tampon l’entrée de votre programme. Pour que votre programme ignore l’entrée reçue pendant son sumil, vous devez effacer le tampon d’entrée avant d’appeler read . A ma connaissance, il n’y a pas moyen de le faire en bash.

Vous pouvez placer votre fonction de sumil dans un bloc où stdin est fermé:

  { sleep 0.2 } <&- 

Alternativement, vous pouvez effacer (lire et supprimer) le tampon stdin juste après le sumil:

 sleep 0.2 read -t 1 -n 10000 discard 

C’est ce que j’ai inventé avec ça. Ce n’est pas très beau, mais ça marche.

 function inputCommand() { _now=`date +%s%N | cut -b1-13` _time=$(($_now-$_timeout)) if [ $_time -gt 500 ]; then $1 _timeout=`date +%s%N | cut -b1-13` fi } function keyPressUp() { echo "Key Press Up" } function waitForInput() { unset _input read -sN1 _input case "${_input}" in A) inputCommand "keyPressUp";; esac } while true; do waitForInput done