Замедленная символика

Интересно, почему обратный символ в обычных терминалах Linux фактически не стирает символы при печати (что обычно работает при вводе).

Это работает как ожидалось:

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

(\b оценивает обратное пространство, может быть вставлено также как Ctrl + V Ctrl + H - отображается как ^H (0x08))

но когда после пробелов меньше символов, обнаруживается странное поведение:

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

он ведет себя как клавиши со стрелками влево вместо backspace:

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

стереть строку обратно работает нормально:

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

Фактически, когда я набираю Ctrl + V Backspace в терминале, ^? (0x7f) получается вместо ^H, это символ Del ascii, но Ctrl + V Del создает <ESC>[3~, но это уже другая история.

Так может кто-нибудь объяснить, почему печатный символ обратного пространства не стирает символы?

(Моя среда - это xterm Linux и некоторые другие эмуляторы терминалов, $TERM == xterm, попробовал vt100, Linux)

Ответ 1

То, что вы видите, является правильным. Backspace или ^H перемещает курсор влево, не стирая. Чтобы стереть символ, вам нужно вывести ^H ^H (Backspace-Space-Backspace).


Чтобы ответить на ваш комментарий - Backspace определяется таким образом в семействе терминалов VT100/ANSI, из которых много терминальных управляющих кодовых последовательностей занимают. См. Руководство пользователя VT100 здесь, которое определяет функцию BS как "Перемещает курсор в левую позицию символа, если он не находится на левом поле, в этом случае никаких действий не происходит". Другими словами, это причуда истории:)

Что касается того, почему он был определен таким образом изначально - я думаю, что более гибко иметь неразрушающий код управления движением курсора, поскольку деструктивное backspace может быть реализовано, как показано выше.