Как сделать цветной bash

Добавил пользователь Алексей Ф.
Обновлено: 18.09.2024

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

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

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

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

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

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


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

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


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

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

В созданном файле .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 - перенос вывода на другую строку;

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

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


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

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

22 июл 2018, 22:12

Для такого пользователя как я, очень важно в консоли найти то место, где заканчивается выхлоп и начинается новое приглашение к вводу. Однако, если приглашение бесцветное, мне это бывает сложно сделать.
Я подумывал об установке оболочки zsh вместо bash - она и в самом деле дает больше удобств.
Однако, изыскивая возможности по настройке zsh нашел попутно несколько вариантов настройки bash. Одни и те же принципы будут работать в любых дистрибутивах. Разница может быть в блоке алиасов (псевдонимов) команд.

Для всех способов потребуется создать (если его нет) файл ~/.bashrc в домашней директории. А второй для root необходимо создать в каталоге /root/.bashrc . Файлы будут очень похожи, но будет и одно небольшое различие позволяющее вам "на глаз" отличить с какими правами вы работаете просто пользовательскими или же с суперпользовательскими.

Буду исходить из того, что файл свежесозданный и пустой (если это не так, то у вас уже цветная консоль, и вам дальше читать не обязательно).
Открываем файлы .bashrc в домашней и рутовой директории (по очереди) и записываем в него всего одну строчку.
для пользователя:

pacman - закоментировал я сам (для иллюстрации, так то можно было строчку и удалить). Т.е вы можете сделать кросплатформенный конфиг и включать отключать нужные опции на разных компьютерах с разными ОС (но одним и тем же башем).

Алиасы можно (и нужно) создавать самостоятельно. Можно не только раскрашивать но и переназначать программы, если вам этого так хочется. Например, можно сообщить оболочке, что бы она по команде top запускала программу htop (этот пакет должен быть у вас установлен)
alias top='htop'
Все алиасы могут быть также использованы для расширения 1 способа.

UPD: данный способ опробовал на основной машине. Все прекрасно заработало.
======================

Возможно, кто-то захочет поделиться своими конфигами? (желательно с коментариями)

При написании сложных скриптов часто появляется необходимость выделить более важную информацию из потока служебной информации запущенного скрипта. Сегодня научимся раскрашивать вывод скрипта в BASH.

Начнем с небольшой таблицы соответствия esc-кодов:

Использовать цвета вывода очень просто - необходимо использовать команду "echo" с параметром "-e" перед текстом, который хотим раскрасить, вставить esc-код нужного цвета, а за этим текстом вставить esc-код "Text Reset".

user@server: echo -e "\e[1;31m Цветные \e[4;37mвыводы \e[42mскриптов в BASH\e[0m"
Цветные выводы скриптов в BASH

Вид приглашения командной строки Bash определяется переменной PS1 . Его можно просмотреть как любую другую переменную окружения:

Как изменить приглашение (только для данной сессии)

Можно установить переменную PS1 только для текущей сессии в терминале. Это удобно, пока вы подбираете, как будет выглядеть строка приглашения. Чтобы это сделать нужно выполнить команду export для переменной PS1 , например:

После выполнения команды строка приглашения в терминале сразу изменится.

Как изменить приглашение на постоянной основе

Новое значение переменной PS1 прописывается в файле .bashrc , который расположен в вашей домашней директории (файл может отсутствовать).

Откроем файл .bashrc в редакторе nano для редактирования. Для этого в терминале выполним команду:

Перейдем в конец файла и добавим новую строку, в которой пропишем значение переменной PS1 . Например:

Сохраним изменения и закроем файл. Для этого нажмите Ctrl+X, затем Y и Enter, чтобы сохранить изменения.

Теперь выполним команду source, чтобы наши изменения вступили в силу:

Перезапустите терминал. Приглашение для ввода команд будет обновлено.

Как изменить цвета в строке приглашения

Элементы строки приглашения можно раскрашивать в разные цвета.

Чтобы задавать цвета для элементов строки приглашения нужно части строки приглашения заключать в специальные символы.

Используется следующий синтаксис:

e[ - начало цветовой схемы. X;Ym — цветовая пара (X;Y). Именно значения X и Y определяют цвет. e[m — окончание цветовой схемы.

Небольшой пример, чтобы вы понимали о чем идет речь. Раскрасим всю строку целиком цветом с обозначением 0;36 .

Цвета задаются числами. Можно задавать парой X;Y или просто Y. Например, красный это — 0;31 или просто 31. Есть и другие способы задания цветов, но в данной статье мы их не рассматриваем.

Список цифровых обозначений для цветов (Y):

Цвет Числовое обозначение
Black 30
Red 31
Green 32
Brown 33
Blue 34
Purple 35
Cyan 36
Light gray 37
Dark gray 90
Light red 91
Light green 92
Light yellow 93
Light blue 94
Light magenta 95
Light cyan 96
White 97

При задании цвета двумя числами X;Y, первое число X принимает следующие значения:

Примеры

Простой вывод текущего пользователя и полного пути:

Такойже вывод, но с подстветкой:

Список возможных настроек приглашения

Для задания различных значений переменной PS1 существуют специальные символы. Комбинируя различные специальные символы можно составить свою строку приглашения.

Специальные символы начинаются с символа косой черты \ , за которой следует буква или символ. Ниже приведена таблица специальных символов

Читайте также: