Зміна кольору тексту та фону терміналу?


72

Я можу змінити колір через перевагу, але як я можу змінити колір тла та колір тексту терміналу через командний рядок?


постійно чи випадково?
Яків Влійм

Ви також можете використовувати 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

скріншот1

скріншот

Залежно від того, чи потрібно застосувати колір на передньому плані чи на тлі, використовуйте <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'

скріншот3

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

скріншот4

Те ж саме можна досягти, використовуючи значення 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'

скріншот5

Знову ж таки, потрібно перемальовувати підказку, використовуючи printf '\e[K'для того, щоб колір фону застосовувався до всієї лінії та для того, щоб колір переднього плану застосовувався до курсору:

скріншот6

Використовуючи обидва методи, ви можете printf '\e[0m'скинути всі атрибути:

скріншот7


1
Обидва xtermі gnome-terminalрозпізнають \ e [38/48; 2; R; G; Bm істинні послідовності кольорів; однак xtermокруглює фактичний колір до найближчого у своїй 256-кольоровій палітрі. gnome-terminalвідображає точний справжній колір, вказаний у послідовності евакуації.
Егмонт

2
\ e [K небезпечно; у деяких емуляторах (наприклад xterm), якщо курсор знаходиться в самому правому краї (візуально відображається в правому правому стовпчику, але логічно вже поза цим, оскільки символ був надрукований у самому правому стовпчику), цей останній лист викреслюється. Див., Наприклад, bugzilla.gnome.org/show_bug.cgi?id=740789 або savannah.gnu.org/bugs/?36831 .
Егмонт

Виправлення себе: Якщо ви випромінюєте \ e [K на початку рядка (на початку підказки, а не в кінці його), то, звичайно, це безпечно. (Не буде працювати з багаторядковим запитом чи командою.)
egmont,

@egmont Дякую за корисну інформацію, я бачу, що в GNOME Bugzilla, який позначений як фіксований, це так? Я не можу перевірити це на даний момент, тому зроблю це пізніше, щоб перевірити, чи все ще так (якщо ви не відповісте спочатку) і включити цю інформацію у відповідь.
kos

Нові версії gnome-терміналу не знімають цього символу. Чи правильно це поведінка, сумнівно. Зрештою, графічні емулятори терміналів наслідують деякі старовинні пристрої. Чи слід наслідувати їх погані дизайнерські рішення (як це робить xterm), або ми повинні переосмислити (як це робимо в gnome-терміналі)? Це складне запитання без єдиної правильної відповіді.
Егмонт

33

Інформація, яку ви знайдете на цій сторінці , крім стовпця попереднього перегляду:

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

В bash, то Escкод може бути одним з наступних способів :

  1. \e
  2. \033 (восьмеричний)
  3. \x1B (шістнадцятковий)

Примітка 1:\e[0m послідовність " " видаляє всі атрибути (форматування та кольори). Це може бути хорошою ідеєю, щоб додати його в кінці кожного кольорового тексту.

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

Встановити / Скинути

  • 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: Блимає (не працює в більшості терміналів, крім XTerm): echo -e "Normal \e[5mBlink"
  • 7: Зворотний / зворотний: echo -e "Normal \e[7minverted"
  • 8: Приховано (корисно для конфіденційної інформації): 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: Cyan
  • 37: Світло-сірий
  • 90: Темно-сірий
  • 91: Світло-червоний
  • 92: Світло-зелений
  • 93: Світло-жовтий
  • 94: Блакитний
  • 95: Світло-пурпурна / рожева
  • 96: Світло-блакитний
  • 97: Білий

Фон

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

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

256 варіантів кольорів див. На сторінці джерела.


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.
користувач1770201

Працював 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-терміналу, і вступає в силу негайно на всіх вкладках і вікнах одного і того ж профілю. Я не думаю, що ОП шукала такої поведінки.
Егмонт

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-значень кольорів переднього плану та фонових кольорів за замовчуванням, використовуючи послідовності виходу 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, це все ще впливає лише на поточний термінал.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.