Как подавить эхо функции проверки ошибок

Я пытаюсь захватить нажатие клавиши в сценарии оболочки (например, используя 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 Это происходит особенно часто, когда машина работает медленно (из-за разряда батареи), что указывает на состояние гонки.

Я что-то упускаю? В противном случае, как я могу обойти эту проблему?

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