12

我想知道为什么普通 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+时,产生的是( ) 而不是,这是ascii 字符,但+产生的是 ,但这是另一回事。V Backspace^?0x7f^HDelCtrlV Del<ESC>[3~

那么有人可以解释为什么打印的退格字符不会擦除字符吗?

(我的环境是 xterm Linux 和其他一些终端模拟器,$TERM== ,xterm也试过)vt100Linux

4

1 回答 1

23

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


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

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

于 2010-05-18T10:32:40.590 回答