2013-03-28 3 views
24

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

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.

+1

В Википедии есть хорошая статья о [кодах побега ANSI] (http://en.wikipedia.org/wiki/ANSI_escape_code#graphics)! Но, хотя они говорят, что есть способ генерировать цветной выход RGB ('\ 033 [38; 2; r; g; bm'), я не могу заставить его работать в моем терминале gnome. –

+2

Стоит упомянуть: это не имеет никакого отношения к 'bash'. Управляющие последовательности ANSI интерпретируются вашим * терминалом * ('gnome-terminal',' xterm', 'konsole' и т. Д.). 'bash' - это просто * shell * (командный интерпретатор), запущенный вашим терминалом. – MestreLion

ответ

42

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

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

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


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

\ 033 это код выхода. [38; направляет команду на переднего плана. Если вы хотите изменить цвет фона, используйте [48;. 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

+0

Я считаю, что '\ e' читается легче, чем '\ 033' или '\ x1b' –

+0

@AaronJLang '\ e' не поддерживается во всех оболочках. – Qix

+4

0-256 не 256 цветов; это 257 цветов! : P – HelloGoodbye

-3

Нет, нет.

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

+1

Да, [есть] (http://en.wikipedia.org/wiki/ANSI_escape_code), хотя он не поддерживается многими оболочками. Вместо '38; 5' вы должны использовать' 38; 2'. Просто попробовал в XTerm - отлично работает. – Qix

+0

@Qix Вы можете установить цвета, но я отвечаю на вопрос, можно ли установить * RGB-цвета *, то есть произвольные цвета, что невозможно. –

+2

Не знаете, где вы получаете информацию, но да; посмотри на мой ответ. Полные 24-битные цвета RGB. – Qix

51

Оба ответа здесь не упомянуть TruecolorANSI support для 8bpc цвета. Это получит цвет RGB, изначально запрошенный OP.

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

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

if your terminal supports Truecolor Чтобы проверить:

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

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


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

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

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

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


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

Происходящие цвета 216 (16-231) образованы смещением RGB на 3bpc на 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; 
} 

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

+0

Для потомков я являюсь хранителем репозитория, связанным в нижней части этой публикации. – Qix

2

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

Особенность не, поддерживаемая некоторыми другими, например. pterm [шпаклевка], терминология [просвещение], urxvt.

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

+0

Интересный факт о Xterm. Очевидно, они тоже делают это неправильно. – Qix

 Смежные вопросы

  • Нет связанных вопросов^_^