退格字符怪异

时间:2010-05-18 10:27:46

标签: text terminal backspace

我想知道为什么普通Linux终端中的退格字符在打印时实际上不会删除字符(通常在输入时有效)..

这可以按预期工作:

$ echo -e "abc\b\b\bxyz"
xyz

\b评估为退格,也可以插入 Ctrl + V Ctrl + H - 呈现为^H0x08))

但是当退格后的字符数量减少时,会发现奇怪的行为:

$ 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,尝试过xtermvt100

1 个答案:

答案 0 :(得分:18)

你所看到的是正确的。退格键或^H将光标向左移动,不进行删除。要删除字符,您需要输出^H ^H(Backspace-Space-Backspace)。


回答您的评论 - Backspace在VT100 / ANSI系列终端中以这种方式定义,许多终端控制代码序列从这些终端借用。请参阅VT100用户手册here,其中将BS的功能定义为“将光标移动到左侧一个字符位置,除非它位于左边距,在这种情况下不会发生任何操作”。换句话说,这是历史的怪癖:)

至于为什么最初以这种方式定义它 - 我认为拥有非破坏性光标移动控制代码更灵活,因为破坏性退格可以如上所示实现。