Специфичная для цвета ANSI последовательность RGB Bash

Я знаю, что в терминалах bash надежный способ изменить цвет — использовать escape-последовательности ANSI. Например:

echo -e "\033[0;31mbrown text\033[0;00m"

должен выводить

brown text (in brown)

Есть ли способ вывести цвет, используя определенный набор RGB с ANSI? Скажем, я хочу ярко-красный:

echo -e "**\033[255:0:0m**red text\033[0;00m"

Существует ли такая вещь?

Я просто хочу использовать стандартный bash.


person Blue Ice    schedule 28.03.2013    source источник
comment
В Википедии есть хорошая статья о escape-кодах ANSI! Но, хотя они говорят, что есть способ генерировать цветной вывод RGB (\033[38;2;r;g;bm), я не могу заставить его работать в моем gnome-терминале.   -  person t.pimentel    schedule 27.08.2014
comment
Стоит отметить: это не имеет ничего общего с bash. Управляющие последовательности ANSI интерпретируются вашим терминалом (gnome-terminal, xterm, konsole и т. д.). bash — это всего лишь оболочка (интерпретатор команд), запускаемая вашим терминалом.   -  person MestreLion    schedule 22.03.2015


Ответы (5)


В обоих ответах здесь не упоминается Truecolor Поддержка ANSI для цвета 8 бит на канал. Это позволит получить цвет RGB, который изначально запросил OP.

Вместо ;5 используйте ;2 и укажите значения R, G и B (0–255) в следующих трех сегментах управления.

\x1b[38;2;40;177;249m

Чтобы проверить, поддерживает ли ваш терминал Truecolor:

printf "\x1b[38;2;40;177;249mTRUECOLOR\x1b[0m\n"

На моей машине XTerm счастливо вывел правильный цвет; тем не менее, терминалы, созданные по образцу терминалов, предшествующих современному цвету RGB, как правило, не будут поддерживать истинный цвет — убедитесь, что вы знаете свою цель, прежде чем использовать этот конкретный вариант escape-кода.


Я также хотел бы отметить 38 и ;5/;2 - Blue Ice упомянул, что 38 маршруты, а затем 5 изменения цвет. Это немного неправильно.

38 — это расширенный код цвета переднего плана xterm-256; 30-37 — это просто 16-цветные коды переднего плана (с яркостью, контролируемой escape-кодом 1 в некоторых системах и предположительно поддерживаемыми 90-97 нестандартными «яркими» кодами), которые поддерживаются всеми цветными терминалами, совместимыми с vt100/xterm. .

;2 и ;5 указывают формат цвета, в конечном итоге сообщая терминалу, сколько еще последовательностей нужно извлечь: ;5 указывает 8-битный формат (как упоминалось Blue Ice), требующий только еще 1 управляющий сегмент, и ;2 указывает полный 24-битный Формат RGB, требующий 3 сегментов управления.

Эти расширенные режимы технически «недокументированы» и полностью определяются реализацией. Насколько я знаю и могу исследовать, они не регулируются комитетом ANSI.


Для тех, кто так склонен, формат 5; (256 цветов) начинается с 16 исходных цветов (как темных, так и светлых, то есть 30–37 и 90–97) в виде цветов 0–15.

Следующие 216 цветов (16-231) формируются значением RGB 3 бита на канал, смещенным на 16, упакованным в одно значение.

Последние 24 цвета (232-256) представляют собой оттенки серого, начиная с оттенка немного светлее черного и заканчивая оттенком немного темнее белого. Некоторые эмуляторы интерпретируют эти шаги как линейные приращения от (256 / 24) на всех трех каналах, хотя я встречал некоторые эмуляторы, которые явно определяют эти значения.

Вот функция Javascript, которая выполняет такое преобразование, принимая во внимание все оттенки серого.

function rgbToAnsi256(r, g, b) {
    // we use the extended greyscale palette here, with the exception of
    // black and white. normal palette only has 4 greyscale shades.
    if (r === g && g === b) {
        if (r < 8) {
            return 16;
        }

        if (r > 248) {
            return 231;
        }

        return Math.round(((r - 8) / 247) * 24) + 232;
    }

    var ansi = 16
        + (36 * Math.round(r / 255 * 5))
        + (6 * Math.round(g / 255 * 5))
        + Math.round(b / 255 * 5);

    return ansi;
}

Таким образом, вы можете рассчитать 256 цветов ANSI из начальных значений RGB, уменьшив их с 8 до 3 бит, чтобы сформировать закодированное значение 256, если вы хотите сделать это программно на терминалах, не поддерживающих Truecolor.

person Qix - MONICA WAS MISTREATED    schedule 31.10.2014
comment
Для потомков я являюсь сопровождающим репозитория, ссылка на который приведена внизу этого поста. - person Qix - MONICA WAS MISTREATED; 07.09.2016
comment
Большое спасибо! Это очень помогло мне в Python. - person Pyzard; 16.08.2020

Это действительно существует, но вместо 16777216 (256 ^ 3) цветов, которые искал OP, есть 216 (6 ^ 3) одинаково распределенных цветов в большем наборе из 256 цветов. Пример:

echo -e "\033[38;5;208mpeach\033[0;00m"

Это выведет текст приятного персикового цвета.


Разбираем эту команду: \033[38;5;208m

\033 — это escape-код. [38; направляет команду на передний план. Если вы хотите изменить цвет фона, используйте [48;. 5; — это просто часть последовательности, которая меняет цвет. И самая важная часть, 208m, выбирает фактический цвет.


Есть 3 набора цветов, которые можно найти в последовательности из 256 цветов для этого побега. Первый набор — это базовый «конфетный» набор цветов или значения от 0 до 15. Затем идет куб распределенных цветов от 16 до 231. Наконец, есть подробный набор оттенков серого от 232 до 255.

Вы можете найти таблицу со всеми этими значениями здесь: http://web.archive.org/web/20131009193526/http://bitmote.com/index.php?post/2012/11/19./Использование-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux

person Blue Ice    schedule 29.03.2013
comment
@AaronJLang \e поддерживается не во всех оболочках. - person Qix - MONICA WAS MISTREATED; 31.10.2014
comment
0–256 — это не 256 цветов; это 257 цветов! :П - person HelloGoodbye; 17.06.2015
comment
@HelloGoodbye, на самом деле это 0-255 (255 — это максимум), так что их 256 уже были правильными .. - person Tony; 16.03.2018

В настоящее время escape-последовательности истинного цвета (\e[38;2;R;G;Bm) поддерживаются некоторыми эмуляторами терминала, включая gnome-terminal (с vte >= 0,36), konsole и st [suckless].

Эта функция не поддерживается некоторыми другими, например. pterm [замазка], терминология [просветление], urxvt.

xterm находится где-то посередине: он распознает escape-последовательности, но округляет каждый цвет до ближайшего в палитре из 256 цветов.

person egmont    schedule 16.04.2015
comment
Интересный факт о Xterm. Они, видимо, тоже делают это неправильно. - person Qix - MONICA WAS MISTREATED; 03.07.2015

Это будет работать

echo -e "**\033[38;2;255;0;0m**red text\033[0;00m"

формат: "\033[38;2;R;G;Bm"

  • R - ваш КРАСНЫЙ компонент вашего RGB
  • G - ваш компонент GRREN вашего RGB
  • B - ваш СИНИЙ компонент вашего RGB
person Fox    schedule 08.07.2020

Нет, нет.

И если придираться, технически это не «управляющие последовательности ANSI», а управляющие коды VT100. (которые были определены задолго до того, как появились графические терминалы и такие термины, как «RGB»).

person Some programmer dude    schedule 28.03.2013
comment
Да, есть, хотя он не поддерживается многими оболочками. Вместо 38;5 вы должны использовать 38;2. Только что попробовал в XTerm - работает нормально. - person Qix - MONICA WAS MISTREATED; 31.10.2014
comment
@Qix Вы можете установить цвета, но я отвечаю на вопрос, можно ли установить цвета RGB, то есть произвольные цвета, что невозможно. - person Some programmer dude; 31.10.2014
comment
Не уверен, откуда вы получаете информацию, но да; посмотри мой ответ. Полные 24-битные цвета RGB. - person Qix - MONICA WAS MISTREATED; 31.10.2014
comment
@Qix Кажется, есть некоторая противоречивая информация об ISO -8613-3, так как речь идет об архитектуре открытых документов, а не о VT100. -подобные коды окраски. Кроме того, кажется, что коды раскраски очень новые и ограничены несколькими эмуляторами терминала. - person Some programmer dude; 31.10.2014
comment
@JoachimPileborg: под очень новым ты имеешь в виду больше, чем десятилетие? И под ограниченным несколькими терминалами вы подразумеваете X-терминалы по умолчанию из Gnome и KDE, а также XTerm и консоль Linux? - person MestreLion; 22.03.2015
comment
Я нахожу немного забавным, что ссылка, которую вы разместили, имеет заголовок ANSI / VT100 Terminal Control Escape Sequences. - person Jason Harwig; 19.03.2020