Когда вы читаете всю строку с простой строкой read
(или read -r
другими опциями, которые не влияют на это поведение), редактор строк, предоставляемый ядром, распознает Backspaceключ для удаления одного символа, а также очень мало других команд (в том числе Returnдля завершения ввода линия и отправить его). Сочетания клавиш можно настроить с помощью stty
утилиты. Говорят, что терминал находится в готовом режиме, когда его редактор строк активен. В необработанном режиме каждый символ, набранный на клавиатуре, немедленно передается в приложение. В готовом режиме символы сохраняются в буфере, и в приложение передаются только полные строки.
Чтобы остановить чтение после фиксированного количества символов, чтобы реализовать read -n
, bash должен переключиться в режим raw. В необработанном режиме терминал не выполняет никакой обработки Backspaceклавиши (к тому времени, когда вы нажимаете Backspace, предыдущий символ уже отправлен в bash), и bash также не выполняет никакой обработки (предположительно, потому что это дает большую гибкость разрешить сценарию выполнять свою собственную обработку).
Вы можете передать опцию, -e
чтобы включить собственный редактор строк в bash (readline, который является правильным редактором строк, не похожий на чрезвычайно грубый редактор ядра). Поскольку bash выполняет строковую редакцию, он может перестать читать, как только наберет требуемое количество символов.
read
читать «количество введенных символов» все еще остается без ответа.