Нашел в интернете несколько статей, решил собрать в одной.
В большинстве дистрибутивов приглашение командной строки Bash по умолчанию того же цвета, что и вводимые команды и текст вывода этих команд. При интенсивной работе в консоли, когда вводится множество команд подряд, бывает трудно сразу увидеть, где оканчивается вывод одной команды и начинается ввод другой, особенно если вывод команд большой. К счастью, Bash позволяет выделить приглашение цветом.
Сначала немного теории.
Вид приглашения командной строки Bash определяется переменной PS1. Его можно просмотреть как любую другую переменную окружения:
\u - специальный символ, означающий логин пользователя (здесь - denister)
\h - специальный символ, означающий имя компьютера (хоста) (calculate)
\w - специальный символ, означающий рабочую директорию. (Как известно, тильда (~) обозначает домашнюю директорию).
Символы @, $ означают сами себя.
А теперь посмотрим значение PS1 по-умолчанию в CLD 11.0 (у меня)
(Я рассматриваю вариант обычного пользователя, не рута.)
Как видим, тут уже присутствует цвет.
Так каким же образом происходит задание цвета символов и фона, а также переключение различных режимов отображения терминала в 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, то окрашиваться в те же самые цвета будут не символы, а фон вокруг них:
Можно также составлять более сложные комбинации цветов фона и шрифта, например
\[\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\]\$ "
\t — выводит время
\d - дату
#Показываем полный путь:
PS1="\[\033[32m\][\w]\[\033[0m\]\n\[\033[1;36m\]\u\[\033[1;33m\]-> \[\033[0m\]"
В этом простом и понятном примере выдаются две строки с данными. В первой строке в удобном формате изображается полный путь, а во второй - только имя пользователя.
\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"
Это обычная командная строка. Цвет выдаваемого сообщения изменится в случае, если возникнут проблемы с выполнением последней команды. Одновременно выдается путь к текущему директорию и для удобства поиска для каждой команды указывается ее номер в списке истории команд bash.
#Выдаем веселую рожицу в случае, если исполнение команды завершилось успешно
PS1="\`if [ \$? = 0 ]; then echo \[\e[33m\]^_^\[\e[0m\]; else echo \[\e[31m\]O_O\[\e[0m\]; fi\`[\u@\h:\w]\\$ "
Идея состоит в том, что если ваша команда будет выполнена успешно, то будет выдаваться веселая рожица. А если команда завершится неудачно — будет выдана печальная рожица.
Ну и если кто еще найдет интересные решения - выкладывайте.
И конечно - man bash раздел PROMPTING