Backspace символ странности - PullRequest
10 голосов
/ 18 мая 2010

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

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

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

(\b оценивается как backspace, также может быть вставлен как 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 Ответ

18 голосов
/ 18 мая 2010

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


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

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

...