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

8

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

while read CMD; do
    echo $CMD
done

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

vrom911
источник
Обратите внимание, что 16.10 достиг конца цикла поддержки в прошлом месяце. Вы должны обновить до 17.04 как можно скорее.
Byte Commander
1
Я предлагаю заменить read CMDна read -e CMD.
Кир
1
попробуй terminatorвместо gnome-terminal. Работает, как и ожидалось
Северус Такс
1
@ Whtyger это сработало для этого сценария. В моей реальной ситуации у меня есть вход из программы, которая не вызывает чтение. У меня нет возможности изменить скрипт программы, это был всего лишь пример, который представлял мою проблему. Есть ли какие-либо глобальные настройки, где я могу сделать эти конфигурации для всех входных данных?
vrom911
1
@Cyrus My Backspace работает как я хочу - он всегда удаляет последний символ, даже для этого скрипта, из вопроса без -eопции. Но на машине @ vrom911 дело обстоит иначе. Интересно, почему это происходит и где это можно настроить.
Шерш

Ответы:

6

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

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

gnome-терминал → настройки профиля → совместимость

Теперь вы можете изменить клавишу Backspace генерирует: настройки. Вы можете выбрать один из этих пяти вариантов ниже. Я добавил в скобках, как они ведут себя в моей системе:

  • Автомат (работает)
  • Control-H (печатает ^Hвместо)
  • ASCII DEL (по умолчанию, работает)
  • Escape-последовательность (печатает ^[[3~вместо)
  • TTY Erase (работает)
Byte Commander
источник
В настоящее время у меня есть ASCII DEL. Я перепробовал все 5 вариантов, но ни один из них не устранил проблему.
vrom911
Это странно. Можете ли вы сказать мне, что type readговорит, и что $SHELL --versionотчеты о оболочке / версии ?
Byte Commander
Я знаю, что это странно. Я много пытался погуглить мою проблему, но не нашел решения, которое мне подходит. 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.

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

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

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

Роджер
источник