ANSI escape-коды
ANSI escape-коды — это стандартизированный набор последовательностей символов, используемый для управления форматированием текста, цветом и положением курсора в текстовых терминалах и эмуляторах терминалов. Они представляют собой специальные управляющие последовательности, начинающиеся с символа Escape (ESC, код 27 в десятичной системе или 0x1B в шестнадцатеричной) и следующих за ним определённых комбинаций символов. ANSI escape-коды позволяют программам, работающим в текстовом режиме, выводить полужирный, курсивный, подчёркнутый текст, изменять цвета переднего и заднего плана, очищать экран, перемещать курсор и выполнять другие действия, не прибегая к графическим интерфейсам. Стандарт был разработан Американским национальным институтом стандартов (ANSI) и впоследствии адаптирован в стандартах ECMA-48 и ISO/IEC 6429.
История
Предпосылки и ранние терминалы
До появления ANSI escape-кодов управление текстовыми терминалами (например, VT52, ADM-3A) осуществлялось с помощью проприетарных управляющих последовательностей, специфичных для каждого производителя. Это создавало серьёзные проблемы совместимости: программа, написанная для одного типа терминала, не могла корректно работать на другом. В 1970-х годах компания Digital Equipment Corporation (DEC) разработала серию терминалов VT100, которые стали доминирующими на рынке. Для управления ими DEC использовала собственный набор управляющих последовательностей, который впоследствии был стандартизирован.
Стандартизация
В 1978 году Американский национальный институт стандартов (ANSI) опубликовал стандарт ANSI X3.64-1979, который определял управляющие последовательности для терминалов. Этот стандарт во многом основывался на последовательностях терминалов VT100. Позднее он был принят как международный стандарт ECMA-48 (1982 год) и ISO/IEC 6429 (1992 год). В этих стандартах управляющие последовательности были разделены на несколько категорий: C0 (управляющие коды, такие как возврат каретки и перевод строки), C1 (восьмибитные управляющие коды, например, ESC), а также CSI (Control Sequence Introducer) — последовательности, начинающиеся с символов ESC [.
Распространение и современное использование
С распространением персональных компьютеров и эмуляторов терминалов (например, xterm, GNOME Terminal, Windows Terminal) ANSI escape-коды стали де-факто стандартом для управления текстовым выводом в консольных приложениях. Они широко используются в операционных системах Unix-подобного семейства (Linux, macOS) и, начиная с Windows 10, в командной строке Windows. Современные языки программирования (Python, C, Rust, JavaScript) имеют библиотеки для работы с ANSI escape-кодами, что упрощает их использование разработчиками.
Синтаксис и структура
Основные компоненты
ANSI escape-коды представляют собой последовательности символов, начинающиеся с управляющего символа ESC (0x1B, \033, \e) и последующего открывающего символа [. Такая последовательность называется CSI (Control Sequence Introducer). После CSI следуют параметры (числовые значения, разделённые точкой с запятой) и завершающий символ, определяющий команду. Общий формат:
`` ESC [ Ps ; Ps ... Pm ``
Где:
ESC— символ Escape (код 27).[— открывающая квадратная скобка.Ps— числовые параметры (опционально, могут отсутствовать).m— завершающий символ, определяющий тип команды (например,mдля установки атрибутов текста,Hдля перемещения курсора).
Примеры
ESC[31m— установить красный цвет текста (параметр 31, командаm).ESC[1;32m— установить полужирный (1) и зелёный (32) текст.ESC[2J— очистить весь экран (параметр 2, командаJ).ESC[10;20H— переместить курсор на строку 10, столбец 20 (командаH).
Классификация команд
Управление атрибутами текста (SGR — Select Graphic Rendition)
Команда m (от m — «mode») является наиболее часто используемой. Она позволяет задавать стиль и цвет текста. Параметры разделяются точкой с запятой. Основные параметры:
| Параметр | Описание |
|---|---|
| 0 | Сброс всех атрибутов (нормальный текст) |
| 1 | Полужирный (яркий) текст |
| 2 | Тусклый текст (dim) |
| 3 | Курсив (не поддерживается всеми терминалами) |
| 4 | Подчёркнутый текст |
| 5 | Мигающий текст (медленное мигание) |
| 7 | Инверсные цвета (текст и фон меняются местами) |
| 8 | Скрытый текст (невидимый) |
| 9 | Зачёркнутый текст |
| 30-37 | Цвет текста (стандартные цвета) |
| 38 | 256-цветный или 24-битный цвет текста |
| 39 | Сброс цвета текста к стандартному |
| 40-47 | Цвет фона |
| 48 | 256-цветный или 24-битный цвет фона |
| 49 | Сброс цвета фона к стандартному |
Стандартные цвета (30-37, 40-47):
| Код | Цвет |
|---|---|
| 30 | Чёрный |
| 31 | Красный |
| 32 | Зелёный |
| 33 | Жёлтый |
| 34 | Синий |
| 35 | Пурпурный |
| 36 | Голубой |
| 37 | Белый |
256-цветный режим (Xterm): Для использования палитры из 256 цветов используется параметр 38 (текст) или 48 (фон), за которым следует ;5; и номер цвета (0-255). Например:
ESC[38;5;196m— установить ярко-красный цвет текста (цвет 196 в палитре).
24-битный цвет (True Color): Для использования 24-битной цветовой палитры (16,7 миллионов цветов) используется параметр 38 или 48, за которым следует ;2;R;G;B, где R, G, B — значения красного, зелёного и синего каналов (0-255). Например:
ESC[38;2;255;100;0m— установить оранжевый цвет текста.
Управление курсором
Команды для перемещения курсора по экрану:
| Команда | Описание |
|---|---|
ESC[H | Переместить курсор в верхний левый угол (1;1) |
ESC[line;colH | Переместить курсор на строку line, столбец col |
ESC[A | Переместить курсор на одну строку вверх |
ESC[B | Переместить курсор на одну строку вниз |
ESC[C | Переместить курсор на один столбец вправо |
ESC[D | Переместить курсор на один столбец влево |
ESC[6n | Запросить позицию курсора (терминал отвечает последовательностью ESC[row;colR) |
ESC[s | Сохранить текущую позицию курсора |
ESC[u | Восстановить сохранённую позицию курсора |
Очистка экрана и строк
| Команда | Описание |
|---|---|
ESC[2J | Очистить весь экран (курсор перемещается в верхний левый угол) |
ESC[K | Очистить строку от курсора до конца |
ESC[1K | Очистить строку от начала до курсора |
ESC[2K | Очистить всю строку |
Управление режимами (DEC Private Modes)
Некоторые команды начинаются с ESC[? и используются для включения/выключения специальных режимов терминала. Например:
ESC[?25h— показать курсор.ESC[?25l— скрыть курсор.ESC[?1049h— включить альтернативный буфер экрана (используется программами вродеvimиless).ESC[?1049l— выключить альтернативный буфер экрана.
Применение
Консольные приложения
ANSI escape-коды широко используются в программах с текстовым интерфейсом (TUI), таких как текстовые редакторы (vim, nano), файловые менеджеры (mc, ranger), системы контроля версий (git), компиляторы (для цветного вывода ошибок), и утилиты командной строки (ls, grep, less). Они позволяют сделать вывод более информативным и удобным для восприятия.
Логирование и отладка
Многие системы логирования и отладки используют ANSI escape-коды для выделения важных сообщений (например, ошибки красным, предупреждения жёлтым). Это облегчает визуальный анализ логов в терминале.
Игры и анимация
В консольных играх (roguelike, текстовые квесты) ANSI escape-коды используются для создания простой анимации (например, перемещение спрайтов) и отображения цветных символов. Также существуют библиотеки для создания полноценных анимаций в терминале (например, blessed в Node.js).
Создание прогресс-баров и индикаторов
При выполнении длительных операций (загрузка файлов, компиляция) программы часто выводят прогресс-бары, обновляя их с помощью возврата курсора (\r) и ANSI escape-кодов. Это позволяет отображать динамическую информацию без засорения экрана.
Ограничения и проблемы
Совместимость
Не все терминалы и эмуляторы полностью поддерживают ANSI escape-коды. Некоторые устаревшие терминалы (например, IBM 3270) не поддерживают их вовсе. В современных эмуляторах (xterm, GNOME Terminal, Windows Terminal) поддержка в целом хорошая, но могут быть различия в обработке некоторых команд (например, курсив или 24-битный цвет).
Безопасность
ANSI escape-коды могут быть использованы для атак, известных как «escape sequence injection» или «terminal injection». Злоумышленник может внедрить вредоносные управляющие последовательности в вывод программы (например, в лог-файл или вывод git), что может привести к выполнению нежелательных действий в терминале (например, перезапись командной строки, ввод команд от имени пользователя). Для защиты от таких атак необходимо санировать входные данные и использовать безопасные режимы отображения.
Производительность
Хотя обработка ANSI escape-кодов не требует значительных вычислительных ресурсов, частое обновление экрана (например, в анимации) может привести к мерцанию и снижению производительности на медленных терминалах или при удалённом подключении (SSH). Для решения этой проблемы используются двойная буферизация и альтернативные буферы экрана.
Интересные факты
- Символ Escape (ESC) был введён в стандарт ASCII как управляющий символ для переключения между режимами работы терминала.
- Терминалы VT100, на которых основан стандарт, были выпущены в 1978 году и оставались популярными до конца 1980-х годов.
- В 2010-х годах Microsoft добавила поддержку ANSI escape-кодов в командную строку Windows (начиная с Windows 10 версии 1511), что значительно улучшило совместимость с Unix-утилитами.
- Существуют онлайн-инструменты и библиотеки для преобразования текста с ANSI escape-кодами в HTML, что позволяет отображать цветной вывод консоли на веб-страницах.
Источники
- ANSI X3.64-1979: American National Standard for Information Systems — Control Sequences for Terminal and Printer Control.
- ECMA-48: Control Functions for Coded Character Sets (5th edition, 1991).
- ISO/IEC 6429: Information technology — Control functions for coded character sets (1992).
- Документация терминала VT100 (Digital Equipment Corporation, 1978).
- Руководство по ANSI escape-кодам на сайте xterm (Thomas Dickey).
- Спецификация Windows Console Virtual Terminal Sequences (Microsoft, 2018).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →