Как подавить эхо неисправной функции чтения

Как подавить эхо неисправной функции чтения

Я пытаюсь захватить нажатие клавиши в скрипте оболочки (например, с помощью read), а не отображать его. Три метода, которые я нашел, были stty -echo, -sswitch и stream redirection.

Однако в macOS, которая, судя по всему, использует реализацию FreeBSD, ни один из этих вариантов не работает стабильно.

Следующий скрипт демонстрирует проблему:

while true; do
    stty -echo
    read -s -n 1 CHAR &>/dev/null
    stty echo
done

При одновременном нажатии стрелок вверх и вниз иногда команда звучит эхом A^[[Bили B^[[A. Это происходит особенно часто, когда машина работает медленно (из-за низкого заряда батареи), что указывает на состояние гонки.

Я что-то упустил? Иначе как мне обойти эту проблему?

решение1

В вашем цикле есть короткий промежуток времени между "stty echo" в конце цикла и "stty -echo" на следующей итерации. Ввод с клавиатуры, полученный в течение этого окна, будет отображен эхом, даже если его не ожидает команда чтения. Если вы не хотите эхо, не вызывайте "stty echo"

Связанный контент