我想知道为什么普通Linux终端中的退格字符在打印时实际上不会删除字符(通常在输入时有效)..
这可以按预期工作:
$ echo -e "abc\b\b\bxyz"
xyz
(\b
评估为退格,也可以插入 Ctrl + V Ctrl + H - 呈现为^H
(0x08
))
但是当退格后的字符数量减少时,会发现奇怪的行为:
$ echo -e "abc\b\b\bx"
xbc
它的行为类似于左箭头键而不是退格键:
$ echo -e "abc\e[D\e[D\e[Dx"
xbc
擦除线路正常工作:
$ echo -e "abc\e[1Kx"
x
事实上,当我在终端输入 Ctrl + V Backspace 时,^?
(0x7f
)是屈服而不是^H
,这是 Del ascii字符,但 Ctrl + V Del 生成{ {1}},但这是另一个故事..
那么有人可以解释为什么打印的退格字符不会删除字符吗?
(我的环境是xterm Linux和其他一些终端模拟器,<ESC>[3~
== $TERM
,尝试过xterm
,vt100
答案 0 :(得分:18)
你所看到的是正确的。退格键或^H
将光标向左移动,不进行删除。要删除字符,您需要输出^H ^H
(Backspace-Space-Backspace)。
回答您的评论 - Backspace在VT100 / ANSI系列终端中以这种方式定义,许多终端控制代码序列从这些终端借用。请参阅VT100用户手册here,其中将BS的功能定义为“将光标移动到左侧一个字符位置,除非它位于左边距,在这种情况下不会发生任何操作”。换句话说,这是历史的怪癖:)
至于为什么最初以这种方式定义它 - 我认为拥有非破坏性光标移动控制代码更灵活,因为破坏性退格可以如上所示实现。