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").