2010-05-18 9 views
8

ich, warum Backspace Charakter gemeinsam Linux-Terminals fragen sich nicht wirklich die Zeichen löschen, wenn sie gedruckt werden (das funktioniert in der Regel, wenn getippt) ..Rück Charakter Seltsamkeit

Dies funktioniert wie erwartet:

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

(\b ausgewertet Backspace können auch Ctrl als + + H VCtrl einfügbar - übertragen als ^H (0x08))

aber wenn es weniger Zeichen nach den Rücktasten ist das seltsame Verhalten offenbart:

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

es wie linke Pfeiltasten statt Backspace verhält:

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

Lösch Linie zurück funktioniert normal:

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

In der Tat , Wenn i Ctrl + VRück im Terminal, ^? (0x7f) ergab anstelle von ^H geben, ist dies Del ASCII-Zeichen, aber Ctrl + VDel<ESC>[3~ produziert, aber Es ist eine andere Geschichte ..

So kann jemand erklären, warum gedruckte Rücktaste Zeichen nicht die Zeichen löscht?

(Meine Umgebung xterm Linux und einige andere Terminal-Emulatoren, $TERM == xterm versuchte vt100, Linux auch)

Antwort

16

Was Sie sehen, ist richtig. Rücktaste oder ^H bewegt den Cursor nach links, kein Löschen. Um ein Zeichen zu löschen, müssen Sie ^H ^H (Backspace-Space-Backspace) ausgeben.


Ihren Kommentar zu beantworten - wird die Rücktaste auf diese Weise in der VT100/ANSI Familie von Terminals definiert, von denen viele Terminal-Steuercodefolgen leihen. Siehe das VT100-Benutzerhandbuch here, das die Funktion von BS definiert als "Verschiebt den Cursor auf die linke Zeichenposition, es sei denn, es befindet sich am linken Rand, in welchem ​​Fall keine Aktion auftritt". Mit anderen Worten, es ist eine Eigenart der Geschichte :)

Warum es ursprünglich so definiert wurde - ich denke, es ist flexibler, einen zerstörungsfreien Cursor Bewegung Steuercode zu haben, wie destruktive Rückschritt kann wie oben gezeigt implementiert werden.

+0

Nun, das ist keine Erklärung _why_ Backspace-Steuerzeichen verhält sich wie linke Cursortaste, nicht nach Commons Sinn (letztes Zeichen löschen) – mykhal

+0

jetzt bin ich zufrieden, danke für die Spec-Link :) – mykhal

+7

Der wahre Grund, es funktioniert dieser Weg ist wegen sogar älterer, "Hardcopy" Terminals, die auf Papier wie eine Schreibmaschine drucken.An einem solchen Terminal gibt es KEINE Möglichkeit, ein Zeichen nach der Ausgabe zu löschen. Schreibmaschinenähnliche Terminals sind auch der Grund dafür, dass wir immer noch mit separaten "Carriage Return" - und "Line Feed" -Zeichen an den Endzeilen von Windows hängen bleiben. – alexis