Примечание
Возможно, вы не сможете раскрасить cmd prompt окна, но это должно работать на многих терминалах unix (или подобных unix).
Также обратите внимание, что некоторые терминалы просто не будут поддерживать некоторые (если таковые имеются) управляющие последовательности ANSI и особенно 24-битные цвета.
использование
Найдите лучшее решение в разделе Проклятия внизу. Индивидуальное или простое решение (хотя не как кросс-платформенное решение) см. в разделе Escape-последовательности ANSI.
TL;DR
Escape-последовательности ANSI
Общие сведения об управляющих последовательностях
Хотя это не лучший способ сделать это, самый простой способ сделать это на языке программирования или скриптов — использовать экранирующие последовательности. Из этой ссылки:
Escape-последовательность — это последовательность символов, используемая для изменения состояния компьютеров и подключенных к ним периферийных устройств. Они также известны как управляющие последовательности, что отражает их использование в управлении устройством.
Предыстория управляющих последовательностей ANSI
Однако это становится еще проще, чем в текстовых видеотерминалах, так как эти терминалы используют экранирующие последовательности ANSI а>эм>. Из этой ссылки:
Управляющие последовательности ANSI являются стандартом внутриполосной сигнализации для управления положением курсора, цветом и другими параметрами текстовых видеотерминалов. Определенные последовательности байтов, большинство из которых начинаются с Esc и '[', встроены в текст, который терминал ищет и интерпретирует как команды, а не как коды символов.
Как использовать управляющие последовательности ANSI
В целом
На языках программирования
Некоторые языки программирования (например, Java) не интерпретируют \e или \x1b как символ ESC. Однако мы знаем, что символ ASCII 27 является символом ESC, поэтому мы можем просто привести тип 27 к char и использовать его для начала управляющей последовательности.
Вот несколько способов сделать это на распространенных языках программирования:
Ява
System.out.println((char)27 + "[33mYELLOW");
Питон 3
print(chr(27) + "[34mBLUE");
print("\x1b[35mMAGENTA");
- Note that
\x1b is interpretted correctly in python
JS-узел
- The following will NOT color output in JavaScript in the Web Console
console.log(String.fromCharCode(27) + "[36mCYAN");
console.log("\x1b[30;47mBLACK_ON_WHITE");
- Note that
\x1b also works in node
В приглашении оболочки ИЛИ сценариях
Если вы работаете с bash или zsh, довольно легко раскрасить вывод (в большинстве терминалов). В Linux, Os X и некоторых терминалах Windows вы можете проверить, поддерживает ли ваш терминал цвет, выполнив оба следующих действия:
printf '\e[31mRED'
printf '\x1b[31mRED'
Если вы видите цвет для обоих, то это здорово! Если вы видите цвет только для одного, используйте эту последовательность. Если вы не видите цвет ни для одного из них, дважды проверьте, что вы все набрали правильно и что вы находитесь в bash или zsh; если вы по-прежнему не видите никакого цвета, возможно, ваш терминал не поддерживает управляющие последовательности ANSI.
Если я правильно помню, терминалы Linux, как правило, поддерживают escape-последовательности как \e, так и \x1b, в то время как терминалы OS X поддерживают только \e, но я могу ошибаться. Тем не менее, если вы видите что-то вроде следующего изображения, то все готово! (Обратите внимание, что я использую оболочку zsh, и она окрашивает мою строку приглашения; кроме того, я использую urxvt в качестве терминала в Linux.)

"Как это работает?" спросите вы. По сути, printf интерпретирует следующую последовательность символов (все, что заключено в одинарные кавычки). Когда printf встречается с \e или \x1b, он преобразует эти символы в символ ESC (ASCII: 27). Это именно то, что мы хотим. Теперь printf отправляет ESC31m, и, поскольку есть ESC, за которым следует правильная управляющая последовательность ANSI, мы должны получить цветной вывод (если он поддерживается терминалом). ).
Вы также можете использовать echo -e '\e[32mGREEN' (например) для цветного вывода. Обратите внимание, что флаг -e для echo "[включает] интерпретацию escape-последовательностей с обратной косой чертой" и должен использоваться, если вы хотите, чтобы echo правильно интерпретировал escape-последовательность.
Подробнее об управляющих последовательностях ANSI
Управляющие последовательности ANSI могут делать больше, чем просто вывод цвета, но давайте начнем с этого и посмотрим, как именно работает цвет; затем мы увидим, как манипулировать курсором; наконец, мы посмотрим и посмотрим, как использовать 8-битный цвет, а также 24-битный цвет (хотя он имеет лишь незначительную поддержку).
В Википедии они ссылаются на ESC[ как CSI, так и я поступлю так же.
Цвет
Для раскрашивания вывода с помощью escape-последовательности ANSI используйте следующее:
CSI n m
CSI: escape character—^[[ or ESC[
n: a number—one of the following:
30-37, 39: foreground
40-47, 49: фон
m: литерал ASCII m — завершает управляющую последовательность.
Я буду использовать bash или zsh, чтобы продемонстрировать все возможные комбинации цветов. Вставьте следующее в bash или zsh, чтобы убедиться в этом (возможно, вам придется заменить \e на \x1b):
for fg in {30..37} 39; do for bg in {40..47} 49; do printf "\e[${fg};${bg}m~TEST~"; done; printf "\n"; done;
Результат:

Краткий справочник (цвет)
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| fg | bg | color |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
| 30 | 40 | black |
| 31 | 41 | red |
| 32 | 42 | green |
| 33 | 43 | yellow |
| 34 | 44 | blue |
| 35 | 45 | magenta |
| 36 | 46 | cyan |
| 37 | 47 | white |
| 39 | 49 | default |
+~~~~~~+~~~~~~+~~~~~~~~~~~+
Выберите графическое представление (SGR)
SGR просто позволяет вам изменить текст. Многие из них не работают на определенных терминалах, поэтому используйте их с осторожностью в проектах производственного уровня. Однако они могут быть полезны, чтобы сделать программный вывод более читабельным или помочь вам различать разные типы вывода.
Цвет на самом деле подпадает под SGR, поэтому синтаксис такой же:
CSI n m
CSI: escape character—^[[ or ESC[
n: a number—one of the following:
0: reset
1-9: включает различные текстовые эффекты
21-29: отключает различные текстовые эффекты (поддерживается меньше, чем 1-9)
30-37, 39: основной цвет
40-47, 49: цвет фона
38: 8- или 24-битный цвет переднего плана (см. 8/24-битный цвет ниже)
48: 8- или 24-битный цвет фона (см. 8/24-битный цвет ниже)
m: литерал ASCII m — завершает управляющую последовательность.
Хотя есть только незначительная поддержка для слабого (2), курсивного (3), подчеркнутого (4), мигающего (5,6), обратного видео (7), скрытого (8) и зачеркнутого (9), некоторые (но редко все), как правило, работают на терминалах Linux и OS X.
Также стоит отметить, что любой из вышеперечисленных атрибутов можно отделить точкой с запятой. Например, printf '\e[34;47;1;3mCRAZY TEXT\n' покажет CRAZY TEXT с blue foreground на white background, и это будут bold и italic.
Eg:

Поместите следующее в оболочку bash или zsh, чтобы увидеть все текстовые эффекты, которые вы можете сделать. (Возможно, вам придется заменить \e на \x1b.)
for i in {1..9}; do printf "\e[${i}m~TEST~\e[0m "; done
Результат:

Как видите, мой терминал поддерживает все текстовые эффекты, кроме для бледного (2), скрытия (8) и зачеркнутого (9).
Краткий справочник (атрибуты SGR 0-9)
+~~~~~+~~~~~~~~~~~~~~~~~~+
| n | effect |
+~~~~~+~~~~~~~~~~~~~~~~~~+
| 0 | reset |
| 1 | bold |
| 2 | faint* |
| 3 | italic** |
| 4 | underline |
| 5 | slow blink |
| 6 | rapid blink* |
| 7 | inverse |
| 8 | conceal* |
| 9 | strikethrough* |
+~~~~~+~~~~~~~~~~~~~~~~~~+
* not widely supported
** not widely supported and sometimes treated as inverse
8-битный цвет
Хотя это поддерживается большинством терминалов, он поддерживается меньше, чем 0-7, 9 цветов.
Синтаксис:
CSI 38;5; n m
CSI: escape character—^[[ or ESC[
38;5;: литеральная строка, обозначающая использование 8-битных цветов для переднего плана.
n: a number—one of the following:
Если вы хотите хорошо просмотреть все цвета в своем терминале, у меня есть хороший скрипт по существу. github.com.
Это выглядит так:

Если вы хотите изменить фон, используя 8-битные цвета, просто замените 38 на 48:
CSI 48;5; n m
CSI: escape character—^[[ or ESC[
48;5;: литеральная строка, обозначающая использование 8-битных цветов для фона.
n: a number—one of the following:
24-битный цвет
Также известный как истинный цвет, 24-битный цвет обеспечивает некоторые действительно интересные функции. Поддержка этого определенно растет (насколько я знаю, это работает в большинстве современных терминалов, кроме urxvt, моего терминала [вставьте злой смайлик]).
24-битный цвет фактически поддерживается в vim (см. vim wiki, чтобы узнать, как включить 24-битный цвет). битовые цвета). Это действительно здорово, потому что оно основано на цветовой схеме, определенной для gvim; например, он использует fg/bg из highlight guibg=#______ guifg=#______ для 24-битных цветов! Неато, да?
Вот как работает 24-битный цвет:
CSI 38;2; r ; g ; b m
CSI: escape character—^[[ or ESC[
38;2;: литеральная строка, обозначающая использование 24-битных цветов для переднего плана.
r,g,b: числа — каждое должно быть 0-255
Чтобы протестировать лишь несколько из множества возможных цветов (я думаю, (2^8)^3 или 2^24 или 16777216), вы можете использовать это в bash или zsh:
for r in 0 127 255; do for g in 0 127 255; do for b in 0 127 255; do printf "\e[38;2;${r};${g};${b}m($r,$g,$b)\e[0m "; done; printf "\n"; done; done;
Результат (это в gnome-terminal, так как urxvt НЕ ПОДДЕРЖИВАЕТ 24-битный цвет... соберитесь, сопровождающий urxvt... серьезно):

Если вам нужны 24-битные цвета для фона... вы уже догадались! Вы просто замените 38 на 48:
CSI 48;2; r ; g ; b m
CSI: escape character—^[[ or ESC[
48;2;: литеральная строка, обозначающая использование 24-битных цветов для фона.
r,g,b: числа — каждое должно быть 0-255
Вставка необработанных Escape-последовательностей
Иногда \e и \x1b не работают. Например, в оболочке sh иногда ничего не работает (хотя в моей системе сейчас работает, не думаю, что раньше).
Чтобы обойти это, вы можете использовать CTRL+V,CTRL+[ или CTRLV,ESC
Это вставит «сырой» символ ESC (ASCII: 27). Это будет выглядеть так ^[, но не волнуйтесь; это только один символ, а не два.
Eg:

Проклятия
Обратитесь к странице Curses (библиотека программирования) для получения полной информации о curses. Следует отметить, что curses работает только в unix и unix-подобных операционных системах.
Работа с проклятиями
Я не буду вдаваться в подробности, потому что поисковые системы могут показать ссылки на веб-сайты, которые могут объяснить это намного лучше, чем я, но я кратко расскажу об этом здесь и приведу пример.
Зачем использовать Curses вместо ANSI Escape?
Если вы читали приведенный выше текст, то могли вспомнить, что \e или \x1b иногда будут работать с printf. Ну иногда \e и \x1b вообще не будут работать (это не стандартно и я никогда не работал с таким терминалом, но это возможно). Что еще более важно, более сложные управляющие последовательности (например, Home и другие многосимвольные клавиши) трудно поддерживать для каждого терминала (если только вы не готовы потратить много времени и усилий на синтаксический анализ terminfo и termcap и т.д.). выяснить, как обращаться с каждым терминалом).
Проклятия решают эту проблему. По сути, он может понять, какие возможности есть у терминала, используя эти методы (как описано в статье в Википедии, ссылка на которую приведена выше):
Большинство реализаций curses используют базу данных, которая может описывать возможности тысяч различных терминалов. Есть несколько реализаций, таких как PDCurses, которые используют специализированные драйверы устройств, а не терминальную базу данных. Большинство реализаций используют термининформацию; некоторые используют терминтермкап. Преимущество Curses заключается в обратной переносимости на терминалы с символьными ячейками и простоте. Для приложения, которое не требует растровой графики или нескольких шрифтов, реализация интерфейса с помощью curses обычно будет намного проще и быстрее, чем реализация с использованием инструментария X.
Большую часть времени curses будет опрашивать terminfo и затем сможет понять, как манипулировать атрибутами курсора и текста. Затем вы, программист, используете API, предоставляемый curses, для манипулирования курсором или изменения цвета текста или других атрибутов, если нужна искомая функциональность.
Пример с Python
Я считаю, что python действительно прост в использовании, но если вы хотите использовать curses на другом языке программирования, просто найдите его в Duckduckgo или любой другой поисковой системе. :) Вот быстрый пример в python 3:
import curses
def main(stdscr):
# allow curses to use default foreground/background (39/49)
curses.use_default_colors()
# Clear screen
stdscr.clear()
curses.init_pair(1, curses.COLOR_RED, -1)
curses.init_pair(2, curses.COLOR_GREEN, -1)
stdscr.addstr("ERROR: I like tacos, but I don't have any.\n", curses.color_pair(1))
stdscr.addstr("SUCCESS: I found some tacos.\n", curses.color_pair(2))
stdscr.refresh() # make sure screen is refreshed
stdscr.getkey() # wait for user to press key
if __name__ == '__main__':
curses.wrapper(main)
результат:

Вы можете подумать про себя, что это гораздо более окольный способ ведения дел, но на самом деле он гораздо более кросс-платформенный (действительно кросс-терминальный… по крайней мере, в мире unix- и unix-подобных платформ). Для цветов это совсем не так важно, но когда дело доходит до поддержки других управляющих последовательностей, состоящих из нескольких последовательностей (таких как Home, End, Page Up, Page Down и т. д.), то curses становится еще более важным.
Пример с Tput
tput — это утилита командной строки для управления курсором и текстом.
tput поставляется с пакетом curses. Если вы хотите использовать кросс-терминальные (ish) приложения в терминале, вам следует использовать tput, поскольку он анализирует terminfo или что-то еще, что ему нужно, использует набор стандартизированных команд (например, curses) и возвращает правильную escape-последовательность.
- пример:
echo "$(tput setaf 1)$(tput bold)ERROR:$(tput sgr0)$(tput setaf 1) My tacos have gone missing"
echo "$(tput setaf 2)$(tput bold)SUCCESS:$(tput sgr0)$(tput setaf 2) Oh good\! I found my tacos\!"
Результат:

Дополнительная информация о Tput
person
dylnmc
schedule
25.06.2014