Як обробити зворотний простір під час читання?


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 (див. Редагування командного рядка ) використовується для отримання рядка.

Виконуючи це, ви можете редагувати вхід будь-яким із способів, коли ви писали б у звичайному запиті оболонки, включаючи зворотній простір 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.