Backspace не работает внутри запуска сценария bash

7

Я запускаю очень простой скрипт, который читает строки за строкой и печатает введенную строку обратно в терминал:

while read CMD; do
    echo $CMD
done

Он отлично работает, но когда я пытаюсь отредактировать строку с символом backspace , он печатает ^? вместо удаления символа. И когда я нажимаю Ctrl + backspace , результат равен ^H . Как можно зафиксировать это поведение, поэтому backspace удаляет символ вместо добавления этих символов? Я пробовал команду stty erase '^?' , но не успешно.

    
задан vrom911 15.08.2017 в 16:16
источник

2 ответа

5

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

Предполагая, что вы используете gnome-terminal в качестве эмулятора, откройте Изменить manu и нажмите Настройки профиля . Перейдите на вкладку Совместимость , и вы должны получить следующие параметры:

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

  • Автоматический (работает)
  • Control-H (вместо этого печатает ^H )
  • ASCII DEL (по умолчанию, работает)
  • Последовательность поиска (вместо этого печатает ^[[3~ )
  • TTY Erase (работает)
ответ дан Byte Commander 15.08.2017 в 16:34
1

У меня была та же проблема, используя bash в Gnome-Terminal.

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

Используйте # stty icanon , чтобы разрешить «канонический (приготовленный) режим». См. Некоторые объяснения здесь Ссылка

Еще один пример моей проблемы / решения: у меня возникла проблема, когда мне нужно вставить более 4 тыс. символов. И во время этого исследования меня привели к вышеуказанной ссылке. Я использовал # stty -icanon , чтобы отключить ограничение 4k, но потерял возможность использовать backspace (стереть).     

ответ дан roger 05.01.2018 в 16:06