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

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

echo -e "3[0;31mbrown text3[0;00m"

вывести

brown text (in brown)

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

echo -e "**3[255:0:0m**red text3[0;00m"

существуют ли такие вещи?

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

4 ответов


оба ответа здесь не упоминают режим truecolor поддержка ANSI для цвета 8bpc. Это получит цвет 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"

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


я также хотел бы указать на 38 и ;5/;2 - Синий Лед указано это 38 маршруты, а затем 5 изменение цвета. Это немного неправильный.

38 - расширенный цветовой код переднего плана xterm-256;30-37 просто 16-цветографические изображения (с яркостью контролируемые код 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) сформированы значением 3BPC RGB смещенным 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.


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

echo -e "3[38;5;208mpeach3[0;00m"

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


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

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


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

вы можете найти таблицу со всеми этими значениями здесь: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize-Your-Bash-Prompt-on-Linux#256%20(8-bit)%20Colors


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

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

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


нет нет.

и для nitpick это технически не "escape-последовательности ANSI", но коды управления VT100 (которые были определены задолго до появления графических терминалов и таких терминов, как"RGB").