Интересно, почему символ возврата в общих терминалах Linux на самом деле не стирает символы при печати (который обычно работает при вводе)..
Это работает как ожидалось:
$ echo -e "abc\b\b\bxyz"
xyz
(\b
оценивает для возвращения, может быть вставлен также как Ctrl+V Ctrl+H - представленный как ^H
(0x08
))
но когда существует меньше символов после того, как клавиши Backspace, странное поведение будет показано:
$ echo -e "abc\b\b\bx"
xbc
это ведет себя как клавиши со стрелкой влево вместо клавиши Backspace:
$ echo -e "abc\e[D\e[D\e[Dx"
xbc
строка стирания назад обычно работает:
$ echo -e "abc\e[1Kx"
x
На самом деле, когда я ввожу Клавишу Backspace Ctrl+V в терминале, ^?
(0x7f
) вместо приводят ^H
, это - символ ASCII Del, но Ctrl+V Del производит <ESC>[3~
, но это - другая история..
Таким образом, кто-то может объяснить, почему печатный символ возврата не стирает символы?
(Моей средой является xterm Linux и некоторые другие эмуляторы терминала, $TERM
== xterm
, испытанный vt100
, Linux
также)
То, что вы видите, верно. Backspace или ^ H
перемещает курсор влево без стирания. Чтобы стереть символ, нужно вывести ^ H ^ H
(Backspace-Space-Backspace).
Чтобы ответить на ваш комментарий - Backspace определяется таким образом в семействе терминалов VT100 / ANSI, из которого заимствовано множество последовательностей кода управления терминалом. См. Руководство пользователя VT100 здесь , в котором функция BS определяется как «Перемещает курсор влево на одну позицию символа, если он не находится на левом поле, и в этом случае никаких действий не происходит». Другими словами, это причуда истории :)
Что касается того, почему это было изначально определено таким образом - я думаю, более гибко иметь неразрушающий код управления перемещением курсора, поскольку деструктивное обратное пространство может быть реализовано, как показано выше.