Почему \ b в конце не выполняет обратный пробел?

Перед входом в систему нажмите Ctrl-Alt-F1. Это откроет окно терминала. Подробнее о различных комбинациях клавиш терминала

0
19.06.2017, 06:23
2 ответа

Backspace сам по себе не является деструктивным, хотя большинство редакторов (и даже командная строка) делают это именно так. Что на самом деле происходит, так это то, что эти программы, хотя и интерактивные, делают резервную копию курсора, затем они пишут пробел и снова делают резервную копию, чтобы правильно расположить курсор.

Таким образом, ваша строка может быть echo -e "abc\b \b", и тогда она будет работать.

Вы можете проверить это, выполнив echo -n -e "abc\b" (-n удаляет автоматический переход на следующую строку). Ваша подсказка теперь перезапишет «c».

Это чем-то похоже на \n, что означает переход на следующую строку (но не на край), и \r, что означает переход на край (но не на край). следующую строку). Операционные системы интерпретируют эти символы по-разному (Unix добавляет следующую строку к \n, DOS имеет оба символа и т. д.).

6
28.01.2020, 02:15

Да, это работает как положено (символ x удаляется):

$ echo -e 'ax\bc'
ac

И да, это "похоже", что при этом теряется символ возврата на одну позицию:

$ echo -e 'abx\b'
abx

Обратите внимание, что символ возврата(\b)не совпадает с клавишей клавиатуры Backspace .
Клавиатура Backspace печатает ^?с Ctrl -VBackspace .
Многие редакторы интерпретируют это как возвращение и удаление персонажа. Это намного сложнее, чем просто напечатать пробел, вся строка вправо должна быть перемещена на один пробел (или два для широких символов, или ноль для управляющих символов )влево для каждого стираемого символа, или, если стертый символ представляет собой новую строку, переместите всю строку на одну строку вверх. Нет, это не простой символ, это целая процедура, связанная с клавишей Backspace .

Однако нет, на самом деле в консоль записывается символ возврата.
Посмотреть, что передается на консоль, можно с помощьюod:

$ echo -e 'abx\b' | od -vAn -tx1c
  61  62  63  08  0a
   a   b   x  \b  \n

Итак, что происходит?

  1. Строка abxзаписывается в консоль.
  2. Консоль выводит abxв линейный буфер.
  3. Символ \bзаписывается в консоль.
  4. Символ \bзаставляет буфер строки консоли перемещаться на один символ назад.
  5. символ \nвыводится на консоль.
  6. Буфер строки консоли перемещается на следующую строку (ничего не печатается ).
  7. На консоль выводится «конец строки».
  8. Консоль выводит весь строковый буфер.

Это стандартный способ работы консолей.

Взгляните на это:

$ printf 'abcdef\b\b\b \n'
abc ef

Символ dзаменяется пробелом.

Почему 'ax\bc'удаляет x?

Поскольку символ cперезаписывает символ x.

2
28.01.2020, 02:15

Теги

Похожие вопросы