Главная >> Инструкции >> Цвета терминала Linux

Цвета терминала 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 -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. Более подробная информация есть, конечно же, в Википедии.

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

Разобравшись, как устанавливать цвета 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 - перенос вывода на другую строку;

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

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]Matrix has you,\u!\[\033[00m\]\n \[\033[01;34m\]Blue pill\[\033[00m\] or \[\033[31m\]red?\[\033[00m\]\--->\$ '

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

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

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

11 комментариев к “Цвета терминала Linux”

  1. Вот объясните мне, ну на койэто надо!? Лучше бы дали возможность настройки автоматически запускаемых команд, как в Deepin Terminal или Gnome Terminal! На кой.... мне эти свистоперделки!? Надо функциональность добавлять, а не куету всякую!

    Ответить
    • Ага давайте ломать глаза об белые буквы на чёрном фоне. И вообще, это же open source, если сильно надо можно пойти и дописать что нужно

      Ответить
    • Познавательно текст интересный... но по существу действительно - херня. Куда интереснее было бы рассмотрение цветовой разметки на терминале результата работы скрипта bash ... или кода C/C++, как это делает например, проект: https://github.com/agauniyal/rang

      Ответить
  2. Я тоже как-то с этой хренью мучился. Хотел покрасивее консоль сделать. А потом просто открыл для себя zsh и oh-my-zsh. Лучше бы об этом статью написали (хотя там и так все просто в принципе).

    Ответить
  3. А мне не нравится стандартный вывод даты и времени, поэтому я в своём Mint LMDE 3 так забацал (здесь ещё код ошибки выполнения предидущей команды выдаётся, если таковая была, например: не выполнилось условие - 1):
    [code]if [[ ${EUID} == 0 ]] ; then
    PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;31m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T") \[\033[01;34m\]\w \$\[\033[00m\] '
    else
    PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]@\[\033[01;32m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T") \[\033[01;34m\]\w \$\[\033[00m\] '
    fi[/code]
    Т.е., по сути - можно любые команды выполнять в PS-переменной 😉

    Ответить
    • И тут же переделал на более удобное, т.к. терминалом пользуюсь постоянно:
      if [[ ${EUID} == 0 ]] ; then
      PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;31m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T" | sed "s/^ //") \[\033[01;34m\]\w\n\$\[\033[00m\] '
      else
      PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]@\[\033[01;32m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T" | sed "s/^ //") \[\033[01;34m\]\w\n\$\[\033[00m\] '
      fi

      Ответить
    • И допеределал уже и под chroot:
      if [[ ${EUID} == 0 ]] ; then
      PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n\[\033[00;34m\]${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;31m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T" | sed "s/^ //") \[\033[01;34m\]\w\n\$\[\033[00m\] '
      else
      PS1='$(e=$?; (( $e != 0 )) && echo -e "\033[33mError: \033[31;1m$e\n\n")\n\[\033[00;34m\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]@\[\033[01;32m\]\h \[\033[00m\]$(date -u "+%e.%m.%Y %A %T" | sed "s/^ //") \[\033[01;34m\]\w\n\$\[\033[00m\] '
      fi

      Ответить
  4. Так всё-так как мне из программы вывести в терминал командой printf что-нибудь типа анаогичного HTML:
    Это красный и зелёный цвета
    ?

    Ответить
  5. Спасибо!!! Чуть ли не единственное нормальное пояснение, на просторах этого интернета, что и как выполнить за 1.5 минуты. (а то всякие индусо-китайцы Вам напишут…..”ответ Чемберлену”…. )

    Ответить
  6. Когда у меня открыто несколько окон терминала: локальная машина, тестовый сервер и боевой, удобно различать их по цветам строки приглашения - например, локальный белый или зелёный, тестовый - жёлтый, боевой - красный.

    Ответить

Оставьте комментарий