Что означает последовательность bash '\ 033 [999D' и где это объясняется?

19

Я сталкивался с последовательностями bash, такими как \033[999Dи \033[2K\rкоторые используются, чтобы сделать некоторые манипуляции с распечаткой на терминале. Но что означают эти последовательности? Где я могу найти список / резюме в Интернете, чтобы помочь мне понять значение этих последовательностей?

Alex
источник
3
Это терминальные последовательности, а не последовательности bash. Вам нужно посмотреть документацию вашего терминала, чтобы определить их функции.
Крис Даун
1
Эти последовательности служат для раскрашивания выходных данных. Проверьте: stackoverflow.com/questions/16845699/… и stackoverflow.com/questions/5947742/…
adizere
1
@adizere не все escape-последовательности меняют цвет. Последовательности в этом Q предназначены для манипулирования строками и перемещения курсора, а не цвета.
Кейси

Ответы:

32

Смотрите эту ссылку http://www.termsys.demon.co.uk/vtansi.htm . Как говорит Энтон, \033 это восьмеричный код в стиле C для escape-символа. [999DПеремещает курсор назад 999 столбцов, предположительно грубой силы способ добраться до начала строки. [2Kстирает текущую строку \rэто возврат каретки, который переместит курсор назад к началу текущей строки и является escape-последовательностью в стиле C, а не управляющей последовательностью терминала.

Обновить

Как отмечали другие люди, эти управляющие последовательности сами по bashсебе ничего не делают , а скорее являются терминальным устройством / эмулятором, на котором появляется текст. Давным-давно было характерно, что эти последовательности интерпретировались совершенно другим аппаратным обеспечением. Первоначально каждый отвечал на совершенно разные наборы кодов. Чтобы справиться с этим, библиотеки termcapи terminfoиспользуются для написания кода, совместимого с несколькими терминалами. Команда tputпредставляет собой интерфейс к terminfoбиблиотеке ( termcapподдержка также может быть скомпилирована) и является более надежным способом создания совместимых последовательностей.

Тем не менее, существует также стандарт ANSI X3.64 или ECMA-48 . Любая современная реализация терминала будет использовать это.terminfoи termcapвсе еще актуальны, так как реализация может быть неполной или включать нестандартные расширения, однако для большинства целей можно предположить, что общие последовательности ANSI будут работать.

xterm FAQ предоставляет интересную информацию о различиях между современными эмуляторов терминалов (многие просто пытаются подражать xtermсебя) и как xtermпоследовательности относятся к VT100 терминалов , упомянутых в приведенной выше ссылке. Он также предоставляет полный список xtermконтрольных последовательностей .

Конечно же, обычно используется консоль Linux, в которой можно найти полный список управляющих последовательностей man console_codes, а также сравнение с xterm.

Graeme
источник
Ссылка, которую вы включили, это просто страница, которую я искал.
Алекс
@Alex Рад, что я нашел это сам, большинство страниц, которые я видел, только цвета обложки и почему-то действительно сложны для чтения. Это легко и просто.
Грэм
будьте осторожны, так как действие escape-кодов зависит от типа терминала (и вы можете эмулировать несколько типов терминалов на современных экранах / ОС). tputВместо этого вы можете использовать команды для большей мобильности, iirc (но за счет меньшего охвата спецификой вашего терминала). VT100 (тот, о котором говорится на странице) поддерживается многими (но я думаю, что поддерживается не все). Но ваша переменная TERM может быть установлена ​​на какой-то другой терминал, и это может повлиять на действие некоторых команд
Оливье Дюлак
@ Оливье, правильно tput, это более надежный способ. Но теперь это повсеместная совместимость с ANSI, а не с конкретным терминалом VT100, хотя я думаю, что можно установить xtermрежим, который их не принимает. Я обновлю немного больше информации об этом, я думаю.
Грэм,
@Olivier Многие терминальные эмуляторы также настроены, TERM=xtermно не реализуют все, что xtermделают.
Грэм
5

Это \033управляющий символ, и эти последовательности не являются специфичными для bash, а интерпретируются терминалом (программным или аппаратным (через сеть или последовательную линию)), в котором выполняется программа (bash). Есть много таких последовательностей .

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

Они часто используются для установки цветов в приглашении bash , но я не нашел ваших конкретных примеров на этой странице.

Энтон
источник
3

«\ 033 [999D» смешно. Некоторые терминалы реализуют меньше escape-последовательностей, поэтому это может потребоваться, если ни один из '\ 033 [1G', '\ 033 [1; 1H', '\ 033 [1; 1f' или '\ r' не будет вести себя так, как они должен, но кто использует отображение текста из тысячи столбцов? Эти последовательности имеют справочную страницу в Linux: console_codes (4) . BJH21 имеет подробный список всех кодов . В зависимости от того, какая программа анализирует '\ 033', может быть доступна более понятная подстановка '\ e'.

На самом деле не предполагается, что они будут использоваться напрямую - правильный способ выдачи команд управления терминалом - это уровень абстракции, такой как ncurses, - но они функционируют так же хорошо из строковых литералов.

user130144
источник
Хороший вопрос, я просто предположил, что \033[999Dбудет резервное копирование за предыдущие строки. Может быть, это просто результат хитрого кодирования;) Вы также можете bashинтерпретировать escape-коды напрямую, например$'\033[999D'
Graeme