Calculate Forum

Как сделать приглашение командной строки Bash разноцветным и не только

Нашел в интернете несколько статей, решил собрать в одной.

В большинстве дистрибутивов приглашение командной строки Bash по умолчанию того же цвета, что и вводимые команды и текст вывода этих команд. При интенсивной работе в консоли, когда вводится множество команд подряд, бывает трудно сразу увидеть, где оканчивается вывод одной команды и начинается ввод другой, особенно если вывод команд большой. К счастью, Bash позволяет выделить приглашение цветом.

Сначала немного теории.

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

PS1.png

\u - специальный символ, означающий логин пользователя (здесь - denister)
\h - специальный символ, означающий имя компьютера (хоста) (calculate)
\w - специальный символ, означающий рабочую директорию. (Как известно, тильда (~) обозначает домашнюю директорию).
Символы @, $ означают сами себя.

А теперь посмотрим значение PS1 по-умолчанию в CLD 11.0 (у меня)
(Я рассматриваю вариант обычного пользователя, не рута.)

PS1_cld.png

Как видим, тут уже присутствует цвет.

Так каким же образом происходит задание цвета символов и фона, а также переключение различных режимов отображения терминала в UNIX (и во множестве других ОС)? Да также, как и в легендарные времена телетайпных терминалов — посылкой на устройство отображения управляющих команд в виде esc-последовательностей (esc сокр. от англ. escape, произносится как эскейп).
Такая последовательность состоит из двух или более символов, первый из которых будет esc (десятичный код равен 27, восьмеричный — 033, шестнадцатеричный — 0x1B). Раскрашивание производится внесением определенных изменений в структуру переменной PS1.
Чтобы расцветить некую часть приглашения, нужно непосредственно перед этой частью подставить выражение \[\033[Хm\]. В случае желтого цвета вместо Х подставляем 33;1. Если подставить просто 33, то получится кирпичный цвет; если 33;4 то кирпичный подчеркнутый; если 33;5 то кирпичный символ станет мигать; если 33,7 то будет черный символ в кирпичном квадратике.
К слову сказать, безразлично в каком порядке ставить значения вокруг точки с запятой, так 33;1 эквивалентно 1;33.

Вот таблица основных цветов

Черный          30
Темно-красный   31 
Зеленый           32
Кирпичный       33
Синий            34
Фиолетовый        35
Бирюзовый         36
Серый           37
Ярко-красный      38

Добавление к номеру цвета через точку с запятой единицы дает более светлый оттенок:

31;1    Розовый
33;1     Желтый  и т. д.

Добавление к номеру цвета через точку с запятой четверки дает подчеркивание.
Добавление к номеру цвета через точку с запятой пятерки дает мигающий символ.
Добавление к номеру цвета через точку с запятой семерки дает черный символ на фоне соответствующего цвета.
Если вместо номеров 30-38 подставить номера 40-48, то окрашиваться в те же самые цвета будут не символы, а фон вокруг них:

PS1_fon.png

Можно также составлять более сложные комбинации цветов фона и шрифта, например
\[\033[01;32;42m\].

Внимательно просмотрев все вышеприведенные команды, следует обратить внимание, что все они заканчиваются одним и тем же выражением \[\033[00m\]. Дело в том, что данное выражение равнозначно выражению \[\033[m\], что задает “никакой” цвет, то есть тот цвет, что был первоначально. Это необходимо, чтобы весь дальнейший текст (вводимые команды, параметры, вывод команд) производился обычным цветом консольного текста, а не окрашивался в новые цвета.

Изменить PS1 можно прямо из командной строки, набрав например

denister@calculate ~ $ PS1="\[\033[01;42m\]\u\[\033[00m\]@\h\[\033[01;32m\] \w $\[\033[00m\]"

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

#Цвета приглашения командной строки:
PS1="\[\033[01;42m\]\u\[\033[00m\]@\h\[\033[01;32m\] \w $\[\033[00m\]"

Хочу заметить, что если вы смените пользователя, например на рута, то все цвета опять изменятся по-умолчанию. Чтобы раскрасить приглашение BASH другого пользователя, нужно создать такой же файлик .bashrc в домашней директории этого пользователя, например /root/.bashrc и вписать в него значение PS1.
Можно поменять PS1 глобально в /etc/bash/bashrc, но я этого делать не советую.

Ну а теперь самое интересное!

#Использование различных цветов:

PS1="\[\033[35m\]\t\[\033[m\]-\[\033[36m\]\u\[\033[m\]@\[\033[32m\]\h:\[\033[33;1m\]\w\[\033[m\]\$ "

raznie_cveta.png

\t — выводит время
\d - дату

#Показываем полный путь:

PS1="\[\033[32m\][\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"

polniy_put.png

В этом простом и понятном примере выдаются две строки с данными. В первой строке в удобном формате изображается полный путь, а во второй - только имя пользователя.
\n — перенос строки

#Изменение цвета в случае неверного ввода команды

PS1="\[\033[0;33m\][\!]\`if [[ \$? = "0" ]]; then echo "\\[\\033[32m\\]"; else echo "\\[\\033[31m\\]"; fi\`[\u.\h: \`if [[ `pwd|wc -c|tr -d " "` > 18 ]]; then echo "\\W"; else echo "\\w"; fi\`]\$\[\033[0m\] "; echo -ne "\033]0;`hostname -s`:`pwd`\007"

ismen_cveta.png

Это обычная командная строка. Цвет выдаваемого сообщения изменится в случае, если возникнут проблемы с выполнением последней команды. Одновременно выдается путь к текущему директорию и для удобства поиска для каждой команды указывается ее номер в списке истории команд bash.

#Выдаем веселую рожицу в случае, если исполнение команды завершилось успешно

PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "

rozha.png

Идея состоит в том, что если ваша команда будет выполнена успешно, то будет выдаваться веселая рожица. А если команда завершится неудачно — будет выдана печальная рожица.

Ну и если кто еще найдет интересные решения - выкладывайте.

И конечно - man bash раздел PROMPTING

Отличная подборка. Сам искал подобное, толком не нашел, все разбросано. Перешел на ZSH ))

Mastodon Mastodon