So unterdrücken Sie das Echo einer fehlerhaften Lesefunktion

So unterdrücken Sie das Echo einer fehlerhaften Lesefunktion

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 -sSwitch 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^[[Boder B^[[Aausgegeben. 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.

verwandte Informationen