2010-05-18 15 views
8

Zastanawiam się dlaczego Backspace w postaci wspólnych terminali Linux nie faktycznie wymazać znaki, po wydrukowaniu (który normalnie działa po wpisaniu) ..Backspace charakter niesamowitość

To działa zgodnie z oczekiwaniami:

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

(\b ocenia BackSpace, mogą być umieszczone również jako Ctrl + VCtrl + H - wykonane jako ^H (0x08))

ale kiedy jest mniej znaków po backspace, dziwne zachowanie objawia się:

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

zachowuje się jak klawiszy strzałek lewo zamiast Backspace:

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

erase linia działa normalnie:

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

W rzeczywistości , Gdy typ Ctrl + VBackspace terminalu, ^? (0x7f) jest uzyskane zamiast ^H, to Del ASCII, ale Ctrl + VDel wytwarza <ESC>[3~, ale to jest inna historia ...

Czy ktoś może wyjaśnić, dlaczego drukowana postać Backspace nie wymazuje znaków?

(Moje środowisko jest xterm Linux i inne emulatory terminali, $TERM == xterm, próbował vt100, Linux również)

Odpowiedz

16

Co widzisz jest poprawna. Backspace lub ^H przesuwa kursor w lewo, bez wymazywania. Aby usunąć znak, musisz wypisać ^H ^H (Backspace-Space-Backspace).


Aby odpowiedzieć na komentarz - Backspace jest zdefiniowana w ten sposób w rodzinie VT100/ANSI terminali, z których wiele sekwencji kodów sterujących zacisk pożyczyć. Zobacz instrukcję użytkownika VT100 here, która definiuje funkcję BS jako "Przesuwa kursor do lewej pozycji znakowej, chyba że znajduje się na lewym marginesie, w którym to przypadku nie występuje żadna akcja". Innymi słowy, jest to dziwactwo historii :)

Co do tego, dlaczego tak się pierwotnie zdefiniowano - wydaje mi się, że bardziej elastycznie jest mieć nie niszczący kod kontroli ruchu kursora, ponieważ destruktywny backspace może zostać zaimplementowany, jak pokazano powyżej.

+0

cóż, to nie jest wyjaśnienie _why_ znak kontrolny backspace zachowuje się jak lewy przycisk kursora, nie zgodnie z sensem commons (usuń ostatni znak) – mykhal

+0

teraz jestem zadowolony, dziękuję za link spec :) – mykhal

+7

REALNY powód to działa w ten sposób powstają nawet starsze terminale "papierowe", które drukuje się na papierze jak maszyna do pisania.Na takim terminalu nie ma możliwości wymazania znaku po jego wyprowadzeniu. Terminale przypominające maszyny do pisania również powodują, że nadal mamy do czynienia z oddzielnymi znakami "powrotu karetki" i "wprowadzania linii" do linii końcowych w systemie Windows. – alexis