Открыть сервис

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Цвет текста (стандартные цвета)
38256-цветный или 24-битный цвет текста
39Сброс цвета текста к стандартному
40-47Цвет фона
48256-цветный или 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 →