Ich versuche, einen Tastendruck in einem Shell-Skript (z. B. mit read
) zu erfassen und nicht zu wiederholen. Die drei Methoden, die ich gefunden habe, waren stty -echo
, der -s
Switch und die Stream-Umleitung.
Unter macOS, das anscheinend eine FreeBSD-Implementierung verwendet, funktioniert jedoch keine davon konsistent.
Das folgende Skript zeigt das Problem:
while true; do
stty -echo
read -s -n 1 CHAR &>/dev/null
stty echo
done
Wenn Sie die Pfeiltasten nach oben und unten gleichzeitig drücken, wird manchmal ein Echo des Befehls A^[[B
oder B^[[A
ausgegeben. Dies tritt besonders häufig auf, wenn der Computer langsam ist (aufgrund einer schwachen Batterie), was auf einen Race Condition hinweist.
Übersehe ich etwas? Wie kann ich dieses Problem sonst umgehen?
Antwort1
In Ihrer Schleife gibt es ein kurzes Zeitfenster zwischen dem „stty echo“ am Ende der Schleife und dem „stty -echo“ bei der nächsten Iteration. Tastatureingaben, die während dieses Fensters empfangen werden, werden als Echo ausgegeben, auch wenn kein Lesebefehl darauf wartet. Wenn Sie keine Echos wünschen, rufen Sie „stty echo“ nicht auf.