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