Backspace не працює всередині запущеного скрипта bash


8

Я запускаю дуже простий скрипт, який читає рядок за рядком і друкує введений рядок назад до терміналу:

while read CMD; do
    echo $CMD
done

Це добре працює, але коли я намагаюся редагувати рядок із backspaceсимволом, він друкує ^?замість видалення символу. І коли я натискаю Ctrl+ backspaceвихід є ^H. Як можна було б виправити таку поведінку, щоб backspaceвидалити символи замість того, щоб додати ці символи? Я спробував stty erase '^?'командувати, але не вдало.


Зверніть увагу, що 16.10 завершився цикл підтримки минулого місяця. Вам слід якнайшвидше оновити до 17.04.
Командир байтів

1
Я пропоную замінити read CMDна read -e CMD.
Сайрус

1
спробуйте terminatorзамість gnome-terminal. Його робота працює як очікувалося
Severus Tux

1
@whtyger це працювало для цього сценарію. У моїй реальній ситуації я маю вхід від програми, яка не закликає читати. У мене немає можливості змінити сценарій програми, це був лише приклад, який представляв мою проблему. Чи є якісь глобальні налаштування, де я можу зробити ці конфігурації для всіх даних?
vrom911

1
@Cyrus My Backspace працює як я хочу - він видаляє останнього символу завжди, навіть для цього сценарію з питання без -eваріанту. Але на машині @ vrom911 це не так. Цікаво, чому це відбувається і де це можна налаштувати.
Шерш

Відповіді:


6

Проблема полягає в тому, що існує багато способів представити зворотний простір, але readкоманда не розуміє їх усіх. Ви повинні мати можливість налаштувати, що саме надсилається при натисканні ← Backspaceклавіші в налаштуваннях емулятора терміналу.

Припустимо, що ви використовуєте gnome-terminalяк емулятор, відкрийте Правка і натисніть Налаштування профілю . Перейдіть на вкладку Сумісність , і вам слід отримати такі параметри:

gnome-terminal → налаштування профілю → сумісність

Тепер ви можете змінити Backspace ключ генерує: налаштування. У вас є наступні п'ять варіантів, з яких можна вибрати. Я додав в дужки, як вони поводяться в моїй системі:

  • Автоматичний (працює)
  • Control-H (друкує ^Hзамість цього)
  • ASCII DEL (за замовчуванням, працює)
  • Послідовність втечі ( ^[[3~замість цього друкується )
  • TTY Erase (працює)

В даний час у мене є ASCII DEL. Я спробував усі 5 варіантів, але жоден з них не вирішив проблему.
vrom911

Це дивно. Чи можете ви сказати, що type readговорить, і що $SHELL --versionзвітів оболонки / версії ?
Байт-командир

Я знаю, що це дивно. Я багато намагався гуглювати свою проблему, але не знайшов рішення, яке працює для мене. type readкаже read is a shell builtin. і $SHELL --versionкажеGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911

1

У мене була така ж проблема, використовуючи bash в Gnome-Terminal.

Зауважте, що в командному рядку резервна область працює як очікувалося, але коли моя програма (простий клієнт чату на основі сокета TCP) читає з stdin, backspaceсимвол друкує (повторюється назад на екран) ^?замість видалення останнього символу.

Використовуйте, # stty icanonщоб дозволити "канонічний (приготовлений) режим". Див. Пояснення тут /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Ще деяке тло моєї проблеми / рішення: у мене виникла проблема, де мені потрібно вставити більше 4-х символів. І під час цього дослідження мене привели до вищезгаданого посилання. Раніше я # stty -icanonвимикав ліміт 4k, але втрачав можливість використовувати backspace (стирання).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.