Белл и escape-символ в строке подсказки

Моя строка приглашения печатается с использованием этого утверждения,

printf '\033]0;%s@%s:%s\007' user host /home/user 

Зачем нужен escape-символ ( \033 ) и символ колокола ( 007 )? Когда я запускаю ту же команду вручную, она ничего не печатает.

Когда я удалил escape-символы и дал команду as,

 printf '%s@%s:%s' user host /home/user 

он печатает,

 user@home:/home/user 

что легче понять.

Итак, как escape-символы \033 и 007 преобразуются в строку приглашения оболочки?

2 Solutions collect form web for “Белл и escape-символ в строке подсказки”

Только \033 – это побег, и он инициирует escape-последовательность до и включает ; , \033]0; , Это инициирует строку, которая устанавливает заголовок в строке заголовка терминала, и эта строка заканчивается специальным символом \007 .

См. man console_codes :

  It accepts ESC ] (OSC) for the setting of certain resources. In addi‐ tion to the ECMA-48 string terminator (ST), xterm(1) accepts a BEL to terminate an OSC string. These are a few of the OSC control sequences recognized by xterm(1): ESC ] 0 ; txt ST Set icon name and window title to txt. 

Вероятно, вы не видите никаких изменений, потому что ваше приглашение устанавливает заголовок в строку заголовка по умолчанию при возврате в приглашение. Пытаться:

  PROMPT_COMMAND= ; printf '\033]0;Hello World!\007' 

Фактически, escape-последовательность начинается с первого escape-символа и заканчивается \033\007 (ASCII ESC и ASCII BEL ).

0 – параметр, соответствующий Ps в описании для xterm, а текст после точки с запятой – Pt :

  Ps = 0 -> Change Icon Name and Window Title to Pt. Ps = 1 -> Change Icon Name to Pt. Ps = 2 -> Change Window Title to Pt. 

Оба \033] и \033\007 являются частями escape-последовательности, которые могут быть изменены на другие символы. Терминал рассматривает пару байтов как один управляющий символ (так же как 4 байта \007 обрабатываются printf как один символ). Ссылаясь на XTerm Control Sequences , могут быть полезны секции управляющих символов C1 (8 бит) :

 ESC \ String Terminator (ST is 0x9c). ESC ] Operating System Command (OSC is 0x9d). 

в понимании начала управления операционной системой :

 OSC Ps ; Pt ST OSC Ps ; Pt BEL 

Использование BEL ( \007 ) для завершения escape-последовательности является аномалией. Он не соответствует стандарту ( ECMA-48 ). Элементы управления операционной системой должны начинаться с ESC ] или 0x9d и заканчиваться ESC \ или 0x9c.

Давным-давно разработчик (ы) xterm добавил escape-последовательность для установки заголовка. В X11R1 (1987) программа просто считывает последовательность до тех пор, пока не получит непечатаемый символ. Позже, в X11R4 (1989), кто-то улучшил это, BEL символ BEL . Стандарт был примерно дольше, но причина выбора BEL а не ST неизвестна. В конечном итоге это было рассмотрено в конце 1990-х годов, признав либо (но сохраняя BEL как альтернативу, поскольку многие пользователи полагались на жестко кодированное поведение с BEL ).

  • Исключение переменных gawk для команд оболочки
  • Скопируйте скобки в PS1
  • Почему «cal» использует код странного 08 / ^ H / \ b для выделения и как это работает?
  • Сортировка строк с помощью escape-кодов ANSI
  • Когда использовать escape-код bash ANSI C, например $ '\ n'
  • Есть ли причина, по которой я получаю ^ [[A, когда я нажимаю стрелку на экране входа в консоль?
  • Как я могу сопоставить символ разрыва страницы в регулярном выражении?
  • Странная escape-последовательность
  • Почему я должен дважды уйти от «точки»?
  • Переводчик кода ANSI
  • Как использовать grep, сохраняя исходный цвет текста?
  • Linux и Unix - лучшая ОС в мире.