2010-05-18 22 views
8

Mi chiedo perché carattere backspace nei terminali comuni di Linux in realtà non cancella i personaggi, in fase di stampa (che funziona normalmente quando digitato) ..Backspace carattere stranezza

Questo funziona come previsto:

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

(\b viene valutato come backspace, può essere inserito anche come Ctrl +VCtrl + H - resi come ^H (0x08))

, ma quando ci sono meno caratteri dopo i backspace, lo strano comportamento si rivela:

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

si comporta come i tasti freccia sinistra invece di backspace:

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

erase line back funziona normalmente:

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

In effetti , Quando si digita Ctrl + VBackspace nel terminale, ^? (0x7f) viene ceduto invece di ^H, questo è Del caratteri ASCII, ma Ctrl + VDel produce <ESC>[3~, ma è un'altra storia ..

Quindi qualcuno può spiegare perché il carattere backspace stampato non cancella i caratteri?

(Il mio ambiente è xterm Linux e alcuni altri emulatori di terminale, $TERM == xterm, tentò vt100, Linux pure)

risposta

16

Quello che state vedendo è corretta. Backspace o ^H sposta il cursore a sinistra, senza cancellare. Per cancellare un carattere, è necessario produrre ^H ^H (Backspace-Space-Backspace).


Per rispondere alla tua commento - Backspace è definita in questo modo nella famiglia VT100/ANSI di terminali, da cui un sacco di sequenze di codici di controllo del terminale in prestito. Vedere il manuale utente VT100 here che definisce la funzione di BS come "Sposta il cursore nella posizione sinistra di un carattere, a meno che non si trovi sul margine sinistro, nel qual caso non si verifica alcuna azione". In altre parole è un capriccio di storia :)

Sul motivo per cui è stato inizialmente definito in questo modo - immagino sia più flessibile avere un codice di controllo del movimento del cursore non distruttivo, come backspace distruttivo può essere implementato come mostrato sopra.

+0

beh, questa non è una spiegazione _why_ il carattere di controllo backspace si comporta come il tasto cursore sinistro, non secondo il senso comune (cancella l'ultimo carattere) – mykhal

+0

ora sono soddisfatto, grazie per il link spec :) – mykhal

+7

Il vero motivo per cui funziona in questo modo è possibile utilizzare terminali ancora più vecchi, "cartacei", che stampano su carta come una macchina da scrivere.Su un terminale del genere non c'è modo di cancellare un personaggio dopo che è stato emesso. I terminali tipo macchina da scrivere sono anche la ragione per cui siamo ancora bloccati con caratteri "carriage return" e "line feed" separati per terminare le linee su Windows. – alexis