2010-05-18 35 views
8

我不知道爲什麼在常見的Linux終端退格鍵實際上並不刪除字符,打印時(通常鍵入時有效)..退格性格古怪

這按預期工作:

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

\b計算結果爲退格,也可以插入作爲Ctrl鍵 + VCtrl鍵 + ħ - 呈現爲^H0x08))

,但是當有在退格後更少的字符,行爲怪異揭曉:

$ echo -e "abc\b\b\bx" 
xbc 

它像左箭頭鍵而不是退格鍵:

$ echo -e "abc\e[D\e[D\e[Dx" 
xbc 

擦除回線正常工作:

$ echo -e "abc\e[1Kx" 
x 

實際上當I型按Ctrl + V退格在終端,^?0x7f)的產生,而不是^H,這是德爾 ASCII字符,但Ctrl鍵 + V德爾產生<ESC>[3~,但這是另一回事..

所以有人可以解釋爲什麼打印退格字符不會擦除字符?

(我的環境是Linux的的xterm和其他一些終端仿真器,$TERM == xterm,試圖vt100Linux爲好)

回答

16

你們看到的是正確的。退格或^H將光標向左移動,不擦除。要刪除一個字符,您需要輸出^H ^H(Backspace-Space-Backspace)。


爲了回答您的評論 - Backspace鍵被定義這種方式在VT100/ANSI家庭終端,從很多終端控制代碼序列的借款。請參閱VT100用戶手冊here,該手冊將BS的功能定義爲「將光標移動到左側的一個字符位置,除非它位於左邊緣,在這種情況下不會發生任何動作」。換句話說,它是一個歷史的怪癖:)

至於爲什麼它是最初定義這種方式 - 我想它有一個非破壞性的光標移動控制代碼更靈活,因爲破壞性的退格可以實現,如上所示。

+0

好吧,這不是一個解釋_why_退格控制字符的行爲像左光標鍵,而不是根據普通意義上(擦除最後一個字符) – mykhal 2010-05-18 10:51:00

+0

現在我很滿意,謝謝你的spec鏈接:) – mykhal 2010-05-18 11:23:06

+7

真正的原因它的工作原理這種方式是因爲更舊的「硬拷貝」終端,像打字機一樣在紙上打印。在這樣的終端上,一旦輸出字符就無法擦除字符。類似打字機的終端也是我們仍然在Windows上使用單獨的「回車」和「換行」字符結束行的原因。 – alexis 2012-03-12 13:24:04