Linux change console color

Цвета терминала Linux

Одно из главных преимуществ Linux заключается в том, что при желании в нём можно настроить всё, что угодно. В этом и выражается преимущество проективных систем, над процедурными. Фактически, это конструктор, состоящий из отдельных блоков, каждый из которых можно настроить по своему желанию.

Особенно интересно, если не просто копируешь чужой «рецепт», а пытаешься разобраться, что и как устроено. И даже решая несерьезную задачу, узнаешь что-то новое.

Раскрашиваем цвета вывода ls

Как-то захотелось мне настроить цвета терминала linux в выводе команды ls. Ну не нравился блекло-фиолетовый цвет для каталогов в Linux Mint. Начал разбираться.

Из документации к ls, выяснил, что установка цветов для вывода осуществляется при помощи утилиты dircolors, которая либо устанавливает параметры цвета из своей собственной базы, либо берет их из файла ~/.dircolors. Такого файла в моем домашнем каталоге не было. Также упоминалось, что инициализация использования цветов происходит через ~/.bashrc, файл с настройками командной оболочки, а сами параметры определяются через переменную LC_COLORS.

Действительно, в .bashrc обнаружился скрипт следующего содержания:

Его суть сводится к проверке на наличие утилиты dircolors в системе, присваивания значения переменной и, при удачном выполнении, использовании параметра —color=auto при каждом вызове ls.

Если запустить утилиту dircolors, она выводит значение переменной LC_COLOR.

Также возможен вывод значения переменной LC_COLORS в структурированном виде, указанием ключа:

Поскольку вывод получается длинный, приводить его не буду.

Если перенаправить вывод dircolors -p > ~/.dircolors, то будет создан структурированный файл, из которого и будут браться настройки цветов. Редактируя данный файл и устанавливаются настройки цвета для вывода ls.

В созданном файле .dircolors есть подсказка:

Устанавливая последовательность через точку с запятой и получаем нужный нам цвет в консоли linux, согласно перечисленным. Цвета терминала linux от 30 до 37 для цвета шрифта, а с 40 до 47 для фона. К примеру:

DIR 01;34 подразумевает, что имена директорий будут выделяться жирным шрифтом и синим цветом.

Но таким способом получается всего восемь цветов, а современные эмуляторы терминала способны выводить как минимум 256! Выяснилось, что существуют и другие способы установки цвета. К примеру, значение EXEC 38;5;208;1 — даёт оранжевый толстый шрифт у исполняемых файлов.

Чтобы не перебирать цвета linux вручную, есть уже готовая таблица цветов:

Подставляя в значение цвета 38;5;x — где x цвет из таблицы, получаем необходимый результат. Получается что-то вроде этого:

Но как это работает? Дело в том, что установка цвета вывода информации в эмуляторе терминала осуществляется при помощи ANSI escape-кодов. Это определенная последовательность символов, которая не выводится на экран, однако влияет на вывод. Называется она так, поскольку начинается с \033[ — кода «Esc». Поскольку терминалов и эмуляторов терминалов существует множество, эти управляющие коды стандартизированы. Управлением цветом через последовательность от 30 до 37 — это стандарт ECMA-48. Информация о нем содержится в разделе console_codes. А управление через 38;5;* — определено стандартом T.416. Более подробная информация есть, конечно же, в Википедии.

Читайте также:  Unreal tournament 2004 linux

Раскрашиваем и изменяем строку приглашения:

Разобравшись, как устанавливать цвета linux через esc-коды, не составит труда переделать и раскрасить строку приглашения. За ее вывод отвечает переменная PS1, которая определена в файле ~/.bashrc

В Linux Mint скрипт ее инициализации имеет следующий вид:

То-есть сперва определяется, запустил ли скрипт root или обычный пользователь. Поскольку в подавляющем большинстве случаев имеет место именно второй вариант, то и редактировать нужно строку, следующую после первого ‘else’. Формат строки расшифрован в документации по баш, в разделе «Promting». Из него следует, что esc-последовательность должна начинаться с «\[» и заканчиваться «\]». Таким образом:

  • [\033[01;32m\] — устанавливает зеленый цвет;
  • \u — выводит имя пользователя;
  • \h — выводит имя хоста;
  • [\033[00m\] — очищает установленные атрибуты;
  • [\033[01;34m\] — устанавливает синий цвет;
  • \w — выводит имя рабочей директории;
  • Привет! — пример того, что может быть выведен любой производный текст.

Что ещё можно вывести в строке приглашения:

  • \d — дату, в формате «Wed Dec 28»;
  • \A — время в 24-часовом формате;
  • \! — номер текущей команды в истории;
  • \n — перенос вывода на другую строку;

Введем что нибудь поинтереснее:

И строка приглашения примет вид:

Так, не понял, а откуда взялась ёлка-то?

Ну ладно, на самом деле, если в конец .bashrc вставить echo -e «С Новым годом», то поздравление будет выводиться при каждом запуске терминала перед приглашением ввода. Соответственно, вывод можно раскрашивать каким угодно способом. А там уж и ёлку нарисовать не сложно.

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Источник

Changing colour of text and background of terminal?

I can change the colour through preference , but how can I change the background colour and text colour of terminal through the command line?

You can also use dconf . I have written an answer to similar question before: askubuntu.com/a/628129/295286

5 Answers 5

On certain XTerm/ANSI-compatible terminals (like xterm and gnome-terminal ), you can set colors using a palette bigger then the default 8/16-colors palette (for example using an 88-colors, 256-colors or 16777216-colors (RGB) palette; both xterm and gnome-terminal support both the 256-colors and the 16777216-colors (RGB) palette); mind that the shell might override this (this is the case e.g. for zsh ).

Here’s a script to list the colors in the 256-color palette along with their ANSI color code in XTerm/ANSI-compatible terminals with a 256-color palette support:

Читайте также:  Linux для ноутбуков на русском

screenshot1

screenshot

Depending on whether you want to apply the color to the foreground or to the background, use an value of 38 or 48 (respectively) in the following command:

For example, to set the foreground color ( = 38 ) to red ( = 196 ) and the background color ( = 48 ) to black ( = 0 ):

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

screenshot3

It’s necessary to redraw the prompt using printf ‘\e[K’ in order for the background color to apply to the whole line and in order for the foreground color to apply to the cursor:

screenshot4

The same thing can be accomplished using RGB values instead of ANSI color codes in a compatible terminal; depending on whether you want to apply the color to the foreground or to the background, use an value of 38 or 48 (respectively) in the following command:

For example, to set the foreground color ( = 38 ) to red ( = 255 , = 0 , = 0 ) and the background color ( = 48 ) to black ( = 0 , = 0 , = 0 ):

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

screenshot5

Again, it’s necessary to redraw the prompt using printf ‘\e[K’ in order for the background color to apply to the whole line and in order for the foreground color to apply to the cursor:

screenshot6

Using either methods, you can use printf ‘\e[0m’ to reset all the attributes:

screenshot7

Both xterm and gnome-terminal recognize the \e[38/48;2;R;G;Bm true color escape sequences; however, xterm rounds the actual color to the nearest in its 256-color palette. gnome-terminal displays the exact true color given in the escape sequence.

\e[K is dangerous; in some emulators (e.g. xterm ) if the cursor happens to be at the very right edge (visually displayed in the rightmost column, but logically already beyond that since a character was already printed in the rightmost column), that last letter gets stripped. See e.g. bugzilla.gnome.org/show_bug.cgi?id=740789 or savannah.gnu.org/bugs/?36831.

Correcting myself: If you emit \e[K at the beginning of the line (at the beginning of the prompt, rather than at the end of it) then of course it’s safe. (Won’t work with multiline prompt or command though.)

@egmont Thanks for the useful information, I see that on GNOME Bugzilla that is marked as fixed, is this the case? I can’t test this at this very moment, so I’ll do that later to check if this is still the case (unless you reply first) and include that information in the answer.

No, there is actually a correct answer — the simulation is NOT to reproduce bugs and illogical behaviour.

Читайте также:  Best rdp client linux

Information as found on this page, excluding preview column:

Sequences are composed of the Escape character (often represented by ” ^[ ” or ” ”) followed by some other characters: ” ^[FCm ” (where FC is one of the numbers in the bulleted list below).

In bash , the Esc code can be either of the following:

Note 1: The » \e[0m » sequence removes all attributes (formatting and colors). It can be a good idea to add it at the end of each colored text.

Note 2: Foreground and background colours may vary, depending on the terminal’s configuration and not all colours are supported.

Set/Reset

  • 0 : Reset/remove all modifier, foreground and background attributes: echo -e «\e[0mNormal Text»
  • 1 : Bold/Bright: echo -e «Normal \e[1mBold»
  • 2 : Dim: echo -e «Normal \e[2mDim»
  • 4 : Underlined: echo -e «Normal \e[4mUnderlined»
  • 5 : Blink (doesn’t work in most terminals except XTerm): echo -e «Normal \e[5mBlink»
  • 7 : Reverse/Invert: echo -e «Normal \e[7minverted»
  • 8 : Hidden (useful for sensitive info): echo -e «Normal \e[8mHidden Input»
  • 21 : Reset/Remove bold/bright: echo -e «Normal \e[1mBold \e[21mNormal»
  • 22 : Reset/Remove dim: echo -e «Normal \e[2mDim \e[22mNormal»
  • 24 : Reset/Remove underline: echo -e «Normal \e[4mUnderlined \e[24mNormal»
  • 25 : Reset/Remove blink: echo -e «Normal \e[5mBlink \e[25mNormal»
  • 27 : Reset/Remove reverse/invert: echo -e «Normal \e[7minverted \e[27mNormal»
  • 28 : Reset/Remove hidden: echo -e «Normal \e[8mHidden \e[28mNormal»

Foreground

  • 39 : Default (usually green, white or light gray): echo -e «Default \e[39mDefault»
  • 30 : Black: echo -e «Default \e[30mBlack» (best combined with a background colour: echo -e «Default \e[30;107mBlack on white» )
  • 31 : Red (don’t use with green background)
  • 32 : Green
  • 33 : Yellow
  • 34 : Blue
  • 35 : Magenta/Purple
  • 36 : Cyan
  • 37 : Light Gray
  • 90 : Dark Gray
  • 91 : Light Red
  • 92 : Light Green
  • 93 : Light Yellow
  • 94 : Light Blue
  • 95 : Light Magenta/Pink
  • 96 : Light Cyan
  • 97 : White

Background

  • 49 : Default background color (usually black or blue)
  • 40 : Black
  • 41 : Red
  • 42 : Green
  • 43 : Yellow
  • 44 : Blue
  • 45 : Magenta/Purple
  • 46 : Cyan
  • 47 : Light Gray (don’t use with white foreground)
  • 100 : Dark Gray (don’t use with black foreground)
  • 101 : Light Red
  • 102 : Light Green (don’t use with white foreground)
  • 103 : Light Yellow (don’t use with white foreground)
  • 104 : Light Blue (don’t use with light yellow foreground)
  • 105 : Light Magenta/Pink (don’t use with light foreground)
  • 106 : Light Cyan (don’t use with white foreground)
  • 107 : White (don’t use with light foreground)

To set both the foreground and background colours at once, use ther form echo -e «\e[S;FG;BGm» . For example: echo -e «\e[1;97;41m» (bold white foreground on red background)

For 256 colour options, see the source page.

Источник

Оцените статью
Adblock
detector