2010-05-18 11 views
8

Me pregunto por qué carácter de retroceso en los terminales comunes de Linux no se borra realmente los personajes, cuando se imprimen (que funciona normalmente cuando se escribe) ..Retroceso carácter rareza

Esto funciona como se esperaba:

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

(\b evalúa para retroceder, se puede insertar también como Ctrl + VCtrl + H - dictada como ^H (0x08))

pero cuando hay menos caracteres después de los retrocesos, el comportamiento extraño se revela:

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

se comporta como teclas de flecha izquierda en lugar de la tecla de retroceso:

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

borrado la línea posterior funciona normalmente:

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

De hecho , Cuando escribo Ctrl + VRetroceso en terminal, ^? (0x7f) es cedido en lugar de ^H, esto es Del de caracteres ASCII, pero Ctrl + VDel produce <ESC>[3~, pero es otra historia ...

Entonces, ¿alguien puede explicar por qué el carácter de retroceso impreso no borra los caracteres?

(Mi entorno es xterm de Linux y algunos otros emuladores de terminal, $TERM == xterm, intentó vt100, Linux también)

Respuesta

16

Lo que está viendo es correcta. Retroceso o ^H mueve el cursor hacia la izquierda, sin borrar. Para borrar un carácter, debe generar ^H ^H (Retroceso-Espacio-Retroceso).


Para responder a su comentario - Retroceso se define de esa manera en la familia VT100/ANSI de terminales, de los cuales una gran cantidad de secuencias de código de control de terminal prestado. Consulte el manual de usuario del VT100 here que define la función de BS como "Mueve el cursor a la posición de un carácter izquierdo, a menos que esté en el margen izquierdo, en cuyo caso no se produce ninguna acción". En otras palabras, es un capricho de la historia :)

En cuanto a por qué se definió de esta manera inicialmente, supongo que es más flexible tener un código de control de movimiento del cursor no destructivo, ya que se puede implementar un retroceso destructivo como se muestra arriba.

+0

bueno, esto no es una explicación _por qué el carácter de control de retroceso se comporta como la tecla del cursor izquierdo, no según el sentido común (borrar el último carácter) – mykhal

+0

ahora estoy satisfecho, gracias por el enlace de especificación :) – mykhal

+7

El motivo REAL funciona de esta manera se debe a los terminales "impresos" aún más antiguos que se imprimen en papel como una máquina de escribir.En tal terminal no hay forma de borrar un carácter una vez que se ha emitido. Los terminales de tipo máquina de escribir también son la razón por la que todavía estamos atrapados con caracteres separados de "retorno de carro" y "avance de línea" hasta las líneas finales en Windows. – alexis