Я запускаю очень простой скрипт, который читает строку за строкой и печатает введенную строку обратно в терминал:
while read CMD; do
echo $CMD
done
Он работает нормально, но когда я пытаюсь редактировать строку с backspace
символом, он печатает ^?
вместо удаления символа. И когда я нажимаю Ctrl
+ backspace
выход ^H
. Как можно исправить это поведение, чтобы backspace
удалить символ вместо добавления этих символов? Я попробовал stty erase '^?'
команду, но не успешно.
command-line
bash
vrom911
источник
источник
read CMD
наread -e CMD
.terminator
вместоgnome-terminal
. Работает, как и ожидалось-e
опции. Но на машине @ vrom911 дело обстоит иначе. Интересно, почему это происходит и где это можно настроить.Ответы:
Проблема в том, что существует много способов представления возврата, но
read
команда не понимает их все. Вы должны быть в состоянии настроить, что именно отправляется при нажатии ← Backspaceклавиши в настройках эмулятора терминала.Предполагая, что вы используете в
gnome-terminal
качестве эмулятора, откройте меню « Редактировать» и нажмите «Настройки профиля» . Перейдите на вкладку « Совместимость », и вы должны получить следующие параметры:Теперь вы можете изменить клавишу Backspace генерирует: настройки. Вы можете выбрать один из этих пяти вариантов ниже. Я добавил в скобках, как они ведут себя в моей системе:
^H
вместо)^[[3~
вместо)источник
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)
У меня была такая же проблема, используя 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 (стереть).источник