我登录了一个远程 shell,当我尝试删除一个字符时,它不会直观地显示正在删除的字符,而是保留在那里,并且光标向右移动。该 shell 正在运行 Bash。
例如,如果我键入echoo
并按Backspace一次,提示将如下所示:echoo
。然而,实际上,出现的字符将是正确的(echo
),并且如果我点击Enter该命令,则运行正常。
据我所知,这与打开的问题完全相同这里。我也通过 Kubernetes 进行连接。我运行的命令看起来像kubectl -n <some_kind_of_argument> exec -it <another_argument> -- bash
.
通过阅读其他问题,我发现以下是有用的信息。
root# echo $TERM
xterm
这与我的本地 shell ( ) 输出的值不同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
您正在使用的远程 shell/应用程序期望发送退格键^H
(这通常会将光标向左移动一个单元格)终端)。 shell/应用程序打印一个空格来删除该字符。但它不期望^?
(ASCII DEL,代码127),它通常不会在a中移动光标终端。
然而,实际上,出现的字符将是正确的(回显),并且如果我按 Enter 键,命令将正常运行。
问题中的评论确实说 shell/应用程序实际上将其视为^?
擦除字符,但在某种意义上它可能是硬编码的。但如果不是硬编码的话,可能要注意一下设置stty
。如果是这样,您可以在(远程)shell 初始化中执行此操作
stty erase ^H
(真正的控制/ H
...)然后使用ControlH
, 代替Backspace(或更改您的终端配置以发送^H
而不是^?
)。