Backspace символ странности

Интересно, почему символ возврата в обычные терминалы 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 как "Перемещает курсор влево на одну позицию символа, если только он не находится на левом поле, и в этом случае никаких действий не происходит". Другими словами, это причуда истории:)

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

Другие вопросы по тегам