Как сделать цветной bash
Одно из главных преимуществ 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 существуют специальные символы. Комбинируя различные специальные символы можно составить свою строку приглашения.
Специальные символы начинаются с символа косой черты \ , за которой следует буква или символ. Ниже приведена таблица специальных символов
Читайте также: