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

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

while read CMD; do echo $CMD done

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

7
задан 15 August 2017 в 19:22

4 ответа

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

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

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

Автоматически (работает) Control-H (вместо этого печатает ^H) ASCII DEL (по умолчанию, работает) Последовательность Escape (вместо этого печатает ^[[3~) TTY Erase (работает)
5
ответ дан 18 July 2018 в 08:28

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

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

Используйте # stty icanon, чтобы разрешить «канонический (приготовленный) режим». См. Некоторые объяснения здесь. Https://unix.stackexchange.com/questions/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

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

1
ответ дан 18 July 2018 в 08:28

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

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

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

Автоматически (работает) Control-H (вместо этого печатает ^H) ASCII DEL (по умолчанию, работает) Последовательность Escape (вместо этого печатает ^[[3~) TTY Erase (работает)
5
ответ дан 24 July 2018 в 19:06
  • 1
    В настоящее время у меня есть ASCII DEL. Я пробовал все 5 вариантов, но никто из них не исправил проблему. – vrom911 15 August 2017 в 19:42
  • 2
    Это странно. Можете ли вы рассказать мне, что говорит type read, и что сообщает оболочка / версия $SHELL --version? – Byte Commander 15 August 2017 в 19:53
  • 3
    Я знаю, это странно. Я пытался много проблем с google, но не нашел решения, которое работает для меня. type read говорит read is a shell builtin. и $SHELL --version говорит GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu) – vrom911 15 August 2017 в 20:42

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

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

Используйте # stty icanon, чтобы разрешить «канонический (приготовленный) режим». См. Некоторые объяснения здесь. Https://unix.stackexchange.com/questions/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

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

1
ответ дан 24 July 2018 в 19:06

Другие вопросы по тегам:

Похожие вопросы: