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