Изменение цвета текста и фона терминала?

74

Я могу изменить цвет через настройки, но как я могу изменить цвет фона и цвет текста терминала через командную строку?

TechJhola
источник
постоянно или случайно?
Джейкоб Влейм
Вы также можете использовать dconf. Ответ на подобный вопрос я уже писал ранее: askubuntu.com/a/628129/295286
Сергей Колодяжный
\033[00;34mFOO\033[00m
Рафаэль Баррос

Ответы:

50

На некоторых XTerm / ANSI-совместимых терминалах (например, xtermи gnome-terminal) вы можете устанавливать цвета, используя палитру, превышающую палитру 8/16 цветов по умолчанию (например, используя палитру 88 цветов, 256 цветов или 16777216 цветов (RGB) , оба , xtermи gnome-terminalподдерживают как 256-цвета и 16777216-цвета (RGB) палитры); Имейте в виду, что оболочка может переопределить это (это так, например, для zsh).

Вот скрипт для перечисления цветов в 256-цветовой палитре вместе с их цветовым кодом ANSI в XTerm / ANSI-совместимых терминалах с поддержкой 256-цветовой палитры:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

Screenshot1

Скриншот

В зависимости от того, хотите ли вы применить цвет к переднему плану или к фону, используйте <fg_bg>значение 38или 48(соответственно) в следующей команде:

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

Например, чтобы установить цвет переднего плана ( <fg_bg>= 38) на красный ( <ANSI_color_code>= 196) и цвет фона ( <fg_bg>= 48) на черный ( <ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

screenshot3

Необходимо перерисовать подсказку, используя, printf '\e[K'чтобы цвет фона применялся ко всей строке и чтобы цвет переднего плана применялся к курсору:

screenshot4

То же самое можно сделать, используя значения RGB вместо цветовых кодов ANSI в совместимом терминале; в зависимости от того, хотите ли вы применить цвет к переднему плану или к фону, используйте <fg_bg>значение 38или 48(соответственно) в следующей команде:

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

Например, чтобы установить цвет переднего плана ( <fg_bg>= 38) на красный ( <R>= 255, <G>= 0, <B>= 0) и цвет фона ( <fg_bg>= 48) на черный ( <R>= 0, <G>= 0, <B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

screenshot5

Опять же, необходимо перерисовать приглашение, используя printf '\e[K'для того, чтобы цвет фона применялся ко всей строке и чтобы цвет переднего плана применялся к курсору:

screenshot6

Используя любой из этих методов, вы можете использовать printf '\e[0m'для сброса всех атрибутов:

screenshot7

кос
источник
1
Обе xtermи gnome-terminalраспознают \ e [38/48; 2; R; G; Bm истинные цветовые escape-последовательности; однако xtermокругляет фактический цвет до ближайшего в его 256-цветовой палитре. gnome-terminalотображает точный истинный цвет, заданный в escape-последовательности.
egmont
2
\ e [K опасно; в некоторых эмуляторах (например xterm), если курсор оказывается на самом правом краю (визуально отображается в крайнем правом столбце, но логически уже за этим, поскольку символ уже напечатан в крайнем правом столбце), эта последняя буква удаляется. См., Например, bugzilla.gnome.org/show_bug.cgi?id=740789 или savannah.gnu.org/bugs/?36831 .
egmont
Поправляю себя: если вы используете \ e [K в начале строки (в начале строки, а не в ее конце), тогда, конечно, это безопасно. (Не будет работать с многострочным приглашением или командой.)
egmont
@egmont Спасибо за полезную информацию, я вижу, что в GNOME Bugzilla, которая помечена как исправленная, это так? Я не могу проверить это в данный момент, поэтому я сделаю это позже, чтобы проверить, так ли это до сих пор (если вы не ответите первым) и включите эту информацию в ответ.
Кос
Да, новейшие версии gnome-терминала не лишают этого персонажа. Является ли это правильным поведением, сомнительно. Ведь графические эмуляторы терминала эмулируют некоторые древние устройства. Должны ли мы подражать их плохим проектным решениям (как это делает xterm), или мы должны переопределить (как мы делаем в gnome-терминал)? Это сложный вопрос без единого правильного ответа.
egmont
34

Информация, найденная на этой странице , за исключением столбца предварительного просмотра:

Последовательности состоят из символа Escape (часто обозначаемого как « ^[» или « <Esc>»), за которым следуют некоторые другие символы: « ^[FCm» (где FCодно из чисел в маркированном списке ниже).

В bash, то Escкод может быть одним из следующих способов :

  1. \e
  2. \033 (Восьмеричное)
  3. \x1B (Шестнадцатеричное)

Примечание 1:\e[0m последовательность « » удаляет все атрибуты (форматирование и цвета). Это может быть хорошей идеей, чтобы добавить его в конце каждого цветного текста.

Примечание 2: цвета переднего плана и фона могут различаться в зависимости от конфигурации терминала, и поддерживаются не все цвета .

Set / Reset

  • 0Сбросить / удалить все атрибуты модификатора, переднего плана и фона: echo -e "\e[0mNormal Text"
  • 1: Жирный / Яркий: echo -e "Normal \e[1mBold"
  • 2: Dim: echo -e "Normal \e[2mDim"
  • 4: Подчеркнуто: echo -e "Normal \e[4mUnderlined"
  • 5: Blink (не работает в большинстве терминалов, кроме XTerm): echo -e "Normal \e[5mBlink"
  • 7: Обратный / инвертированный: echo -e "Normal \e[7minverted"
  • 8: Hidden (полезно для конфиденциальной информации): echo -e "Normal \e[8mHidden Input"
  • 21: Сбросить / удалить жирный / яркий: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22: Сброс / удаление тусклых: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24: Сброс / удаление подчеркивания: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25: Сбросить / убрать мигание: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27: Сброс / удаление реверса / инвертирования: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28: Сброс / удаление скрытого: echo -e "Normal \e[8mHidden \e[28mNormal"

передний план

  • 39: По умолчанию (обычно зеленый, белый или светло-серый): echo -e "Default \e[39mDefault"
  • 30: Черный: echo -e "Default \e[30mBlack"(лучше всего сочетается с цветом фона: echo -e "Default \e[30;107mBlack on white")
  • 31: Красный (не используйте с зеленым фоном)
  • 32: Зеленый
  • 33: Желтый
  • 34: Синий
  • 35: Пурпурный / фиолетовый
  • 36: Голубой
  • 37: Светло-серый
  • 90: Темно-серый
  • 91: Светло-красный
  • 92: Светло-зеленый
  • 93: Светло-желтого
  • 94: Светло-синий
  • 95: Светло-пурпурный / розовый
  • 96: Светло-голубой
  • 97: Белый

Фон

  • 49: Цвет фона по умолчанию (обычно черный или синий)
  • 40: Черный
  • 41: Красный
  • 42: Зеленый
  • 43: Желтый
  • 44: Синий
  • 45: Пурпурный / фиолетовый
  • 46: Голубой
  • 47: Светло-серый (не используйте с белым передним планом)
  • 100: Темно-серый (не используйте с черным передним планом)
  • 101: Светло-красный
  • 102: Светло-зеленый (не используйте с белым передним планом)
  • 103: Светло-желтый (не используйте с белым передним планом)
  • 104: Светло-голубой (не используйте со светло-желтым передним планом)
  • 105: Светло-пурпурный / розовый (не используйте со светлым передним планом)
  • 106: Светло-голубой (не используйте с белым передним планом)
  • 107: Белый (не используйте со светлым передним планом)

Для одновременной установки цветов переднего плана и фона используйте форму echo -e "\e[S;FG;BGm". Например: echo -e "\e[1;97;41m"(жирный белый передний план на красном фоне)

256 вариантов цвета см. На исходной странице.

Agi Hammerthief
источник
30

Измените цвета случайно

Если предполагается случайное изменение цвета :

Вы можете использовать команду setterm :

setterm -term linux -back <background_colour> -fore <text_color> -clear

из цветов, которые вы можете выбрать (как передний, так и задний):

black|blue|green|cyan|red|magenta|yellow|white|default

для большего количества вариантов:

setterm -help

Измените настройки своего профиля (цвета)

В 14.04 я не нашел возможности использовать dconfдля установки цветов или терминала. Однако вы можете использоватьgconftool

  • Сначала вам нужно получить имя вашего профиля:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • Затем, чтобы установить цвет текста вашего профиля:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    например, чтобы установить цвет текста на белый

    То же самое с цветом фона:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    например, чтобы установить цвет фона на черный

В качестве альтернативы, чтобы задать название цвета (цветов), вы можете просто использовать whiteили greenиз той же палитры, что и команда setterm, например:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black
Якоб Влейм
источник
1
Это должны быть двойные тире в начальной команде setterm.
user1770201
Работал 14.04, но не 16.04 (бета; не уверен, в этом ли причина) ... Тем dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"не менее, сделал свое дело .
Джанака Бандара
Не работает на Ubuntu 1704, выглядит плохо
Wax Cage
1
gconftool-2(для Ubuntu 14.04 и, возможно, нескольких последующих выпусков), или dconfили gsettingsв более новых версиях Ubuntu измените настройки gnome-терминала и сразу же вступите в силу для всех вкладок и окон одного и того же профиля. Я не думаю, что OP искал такое поведение.
egmont
5

Различные цветовые коды, которые используются для получения цветного вывода, также можно использовать для получения цветного фона :

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

Поэтому следующая команда окрашивает мой фон в красный:

$ echo -e '\e[0;41m'

В зависимости от оболочки, эмулятора терминала и т. Д. Вам может не понадобиться -e.

Мур
источник
3

Посмотрите ответ kos для переключения переднего плана или фона на определенный цвет палитры, или даже прямой цвет RGB в некоторых терминалах. Эффект такой последовательности сохраняется до тех пор, пока не будет выбран другой цвет (или он не вернется к значению по умолчанию)

Другой подход, поддерживаемый некоторыми эмуляторами терминала, заключается в переопределении точных значений RGB для цветов переднего плана и фона терминала по умолчанию с использованием escape-последовательностей OSC 10/11:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

Это может длиться намного дольше (до тех пор, пока не будет отменено другим OSC 10/11 или не будет сброшено через OSC 110/111), но, в отличие от подхода dconf, это по-прежнему влияет только на текущий терминал.

Эгмонт
источник