Есть эта удаленная оболочка, в которую я вхожу, и когда я пытаюсь удалить символ, вместо визуального отображения удаляемого символа он остается там, а курсор перемещается вправо. Эта оболочка запускает Bash.
Например, если я введу echoo
и нажму Backspaceодин раз, приглашение будет выглядеть так: echoo
. Однако на самом деле присутствующие символы будут правильными ( echo
), и если я нажму , Enterкоманда выполнится нормально.
Насколько я могу судить, это точно тот же вопрос, который был открытздесь. Я тоже подключаюсь через Kubernetes. Команда, которую я запускаю, выглядит примерно так kubectl -n <some_kind_of_argument> exec -it <another_argument> -- bash
.
Прочитав другие вопросы, я понял, что следующая информация полезна.
root# echo $TERM
xterm
Это не то же самое значение, которое выводит моя локальная оболочка ( xterm-256color
). Следующее не исправляет проблему.
root# export TERM=xterm-256color
Теперь я делюсь выводом stty -a
.
root# stty -a
speed 38400 baud; rows 43; columns 118; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
Теперь нажатие Ctrl+ vи последующее нажатие Backspaceвыводит следующее:
root# ^?
Кажется, это соответствует выводу выше ( erase = ^?
). Нажатие Enter в приведенном выше приглашении печатает...
bash: $'\177': command not found
Я тоже побежал stty sane
, но это не помогло.
Может ли кто-нибудь помочь мне исправить это и, надеюсь, также помочь мне понять, что происходит?
решение1
Удаленная оболочка/приложение, которое вы используете, ожидает отправки клавиши backspace ^H
(что обычно перемещает курсор влево на одну ячейку вТерминал). Оболочка/приложение печатает пробел для стирания символа. Но оно не ожидает ^?
(ASCII DEL, код 127), что обычно не перемещает курсор вТерминал.
Однако на самом деле присутствующие символы будут правильными (echo), и если я нажму Enter, команда выполнится нормально.
Комментарий в вопросе говорит, что оболочка/приложение на самом деле обрабатывает ^?
как символ стирания, но в каком-то смысле это может быть жестко закодировано. Но если это не жестко закодировано, оно может обращать внимание на настройку stty
. Если это так, вы можете сделать это в своей (удаленной) инициализации оболочки
stty erase ^H
(реальный элемент управления/ H
...) и затем используйте ControlH
, вместо Backspace(или измените конфигурацию терминала, чтобы отправить ^H
вместо ^?
).