Как справиться с возвратом во время чтения?


10

Как мне обработать введенные символы возврата, показывает ^?, пробовал ли и как readподсчитывает символы, так как 12^?3уже 5 символов были завершены (хотя все они не были фактическим вводом), но после 12^?3^?того, как он возвратил подсказку, странно. Пожалуйста помоги!

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$

Ответы:


10

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

Чтобы остановить чтение после фиксированного количества символов, чтобы реализовать read -n, bash должен переключиться в режим raw. В необработанном режиме терминал не выполняет никакой обработки Backspaceклавиши (к тому времени, когда вы нажимаете Backspace, предыдущий символ уже отправлен в bash), и bash также не выполняет никакой обработки (предположительно, потому что это дает большую гибкость разрешить сценарию выполнять свою собственную обработку).

Вы можете передать опцию, -eчтобы включить собственный редактор строк в bash (readline, который является правильным редактором строк, не похожий на чрезвычайно грубый редактор ядра). Поскольку bash выполняет строковую редакцию, он может перестать читать, как только наберет требуемое количество символов.


9

Используйте read -e:

$ read -e -n 5
13acX

read -e Значит это:

Readline (см. Редактирование командной строки ) используется для получения строки.

Когда вы это сделаете, вы можете редактировать ввод любым способом, который вы делаете при записи в обычном приглашении оболочки, включая backspace Homeи т. Д.


1

readэто встроенный Bash. (см type read.) Вы можете найти документацию по man bash:

   read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
   [...]
          -e     If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
                 Readline uses the current (or default, if line editing was not previously active) editing settings.

или вы можете использовать help read:

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
      -e                use Readline to obtain the line in an interactive shell

-eПереключатель позволяет Readline поддержки , которая в основном позволяет все функции , доступные на приглашение оболочки, включая обработку Backspace.

Поэтому read -en 5следует делать то, что вы хотите.


-e решает проблему, но как readчитать «количество введенных символов» все еще остается без ответа.
Кейшов Борат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.