Я пытаюсь захватить нажатие клавиши в скрипте оболочки (например, с помощью read
), а не отображать его. Три метода, которые я нашел, были stty -echo
, -s
switch и 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"