Вопрос или проблема
Вы знаете, что цветной вывод создается специальными последовательностями символов, например:
echo -e "\e[34m Hello\n \e[0m"
Это создаст слово “Hello”, окрашенное в синий. Чтобы сделать это, мне пришлось искать информацию в интернете, и это сложно, потому что разные источники могут давать разные советы. Я думал, что должны быть какие-то руководства, но я не смог их найти. Даже используя apropos color
или что-то подобное. Итак, вопрос – где я могу найти надежные руководства?
Существует слишком много источников информации, чтобы перечислять их на этой странице:
-
Команда
echo -e
использует расширение для отображения\e
как ASCII 27 (восьмеричный 33 или “\033”). Переносимый способ напечатать это используетprintf
(POSIX). Сравните с стандартнымecho
(POSIX). -
Ваш пример можно переписать как
printf "\033[34m Hello\n \033[0m"
-
стандарт для цветных кодов – это ECMA-48 (Управляющие функции для кодированных наборов символов).
-
В ECMA-48, 8.3.117 SGR – SELECT GRAPHIC RENDITION перечислены управляющие последовательности для установки 8 передних и 8 задних цветов.
-
Он также перечисляет коды 39/49 “цвет отображения по умолчанию (определяется реализацией)” и 38/48 “резервируется для будущей стандартизации; предназначен для установки цвета переднего плана символа, как указано в ISO 8613-6 [Рекомендация CCITT T.416]”. То есть, существует рекомендация другой организации, но она не была (до сих пор, после 24 лет) включена в стандарт.
-
читая его внимательно, вы можете заметить, что стандарт остается расплывчатым во многих местах, допуская различные интерпретации. Он описывает синтаксис этих управляющих последовательностей, но не описывает их поведение. Для этого необходимо обратиться к документации соответствующих терминалов.
-
документация для xterm находится в XTerm Control Sequences, которая предполагает знакомство с документацией DEC, находящейся на http://vt100.net
-
для других терминалов их справочные страницы могут перечислять управляющие элементы (как это сделано для консолей Linux в console_codes).
-
другие терминалы объявляют себя как “xterm”; для обсуждения см. FAQ xterm Сравнение версий по количеству управляющих элементов. К счастью, элементы управления цветом в основном совместимы (но см. FAQ ncurses Мой терминал показывает некоторые неокрашенные пробелы).
-
вы также можете ознакомиться с руководствами по
tput
, который позволяет использовать возможностиterminfo
в скрипте оболочки. Ваш пример можно переписать какprintf '%s\n' "$(tput setaf 4)Hello$(tput setaf 0)"
-
несколько источников, таких как Bash Prompt HOWTO и Advanced Bash-Scripting Guide упоминают цвет, но (даже эти) как правило содержат пробелы и опущения и не помогают в отношении ECMA-48.
-
большинство других источников, которые вы найдете при поиске в интернете, копируют информацию из других источников (таких как перечисленные) и, как правило, мало внимания уделяют фактическому стандарту.
Ответ или решение
Конечно, цветной вывод в терминале — это мощный инструмент, который повышает удобство использования и читабельность командной строки. Однако, документация по этому вопросу может быть рассеянной и иногда противоречивой. Давайте разберем все аспекты, связанные с этой темой, чтобы обеспечить вам полное понимание.
Теория: Основы цветного вывода в терминалах
Цветной вывод в терминале достигается использованием специальных управляющих последовательностей ANSI (ANSI escape codes). Эти последовательности начинаются с символа ESC (Escape), который в восьмеричной системе представлен как \033
, и эффект этих последовательностей определяется числовыми кодами. Наиболее распространенные коды связаны с цветовыми оттенками и основными стилями (например, жирный или подчеркнутый текст).
Стандарт для этих управляющих последовательностей описан в спецификации ECMA-48, в частности, для цветного вывода используется последовательность "SGR" (Select Graphic Rendition). ECMA-48 обеспечивает синтаксис для создания этих последовательностей, но не детализирует их поведение, оставляя это на усмотрение реализации терминала.
Пример: Использование цветного вывода с помощью echo
и printf
Для цветного вывода можно использовать команды echo
и printf
. Однако следует учитывать различия в поддержке управляющих последовательностей между echo
и printf
. Например:
echo -e "\e[34m Hello\n \e[0m" # Использует цветное форматирование для вывода
Этот код окрашивает текст "Hello" в синий (код 34). Аналогичный эффект можно достигнуть с помощью printf
:
printf "\033[34m Hello\n \033[0m"
Применение: Где искать ресурсы и документацию
-
Мануалы и спецификации:
- ECMA-48: Это основной стандарт, который описывает управляющие последовательности для цветного и других типов форматирования. Он формирует основу для большинства терминальных приложений и эмуляторов.
-
Документация терминалов:
- XTerm: Для терминалов, таких как xterm, документация по управляющим последовательностям доступна в XTerm Control Sequences.
- Linux Console: Более узкая информация об управляющих кодах доступна в console_codes.
-
Инструменты и скрипты:
- tput: Чтобы не запоминать числовые коды, можно использовать команду
tput
, которая абстрагирует работу с терминалом через использование базы терминальной информацииterminfo
.printf '%s\n' "$(tput setaf 4)Hello$(tput sgr0)"
- tput: Чтобы не запоминать числовые коды, можно использовать команду
-
Ресурсы на основе сообщества:
- Bash Prompt HOWTO и Advanced Bash-Scripting Guide предлагают примеры по использованию цветного форматирования в скриптах Bash. Эти ресурсы часто удобны для быстрого освоения, но могут не содержать всех деталей, связанных с ECMA-48.
Заключение
Итак, основным источником официальной информации об управляющих последовательностях является стандарт ECMA-48. Однако из-за вариаций в реализации, фактическое поведение может различаться в зависимости от используемого терминала. Поэтому желательно сочетать чтение спецификаций с практической работой на нужной платформе и документированием спецификаций конкретного терминала, через который вы работаете.
Также стоит учитывать, что многие онлайн-ресурсы содержат вторичную информацию и могут не всегда содержать наиболее точную или полную информацию, поэтому обращение к первоисточникам или официальной документации терминалов оказывается наиболее надёжным подходом.