Использование цвета в строке приглашения терминала
В большинстве терминалов для Linux доступен некоторый набор цветов, которые вы можете использовать для стилизации строки приглашения или любого другого текста. В терминале можно задать не только цвет текста, но и цвет фона, а также применить форматирование. Чтобы задать цвет для строки приглашения, необходимо изменить значение переменной PS1
задав в ней специальный цветовой код для того текста, который хотим раскрасить. Подробнее о строке приглашения вы можете узнать из этой статьи.
Существуют терминалы, которые поддерживают следующее количество цветов:
- 8 цветов - для 3 битной версии управляющих символов ANSI, поддерживается почти всеми терминалами.
- 16 цветов - для 4 битной версии управляющих символов ANSI, поддерживается почти всеми терминалами.
- 88 цветов - для 7 битной версии управляющих символов ANSI, поддерживается многими современными терминалами.
- 256 цветов - для 8 битной версии управляющих символов ANSI, поддерживается многими современными терминалами.
- 16777216 цветов - для 24 битной версии управляющих символов ANSI, поддерживается только терминалами в современных графических оболочках.
Чтобы узнать сколько цветов поддерживает ваш терминал, введите следующую команду.
tput colors
Установить цвет для текста, цвет фона и форматирование можно, как минимум, двумя способами: с помощью управляющих символов или с помощью команды tput
. Оба варианта подробно рассмотрены далее по тексту.
Изменение цвета текста в терминале с помощью управляющих символов (8/16 цветов)
Цвет в терминалах задается с помощью специальных управляющих символов:
- \e[ - начало форматирования текста.
- x;y;zm - код цвета (x = код форматирования, y = код цвета текста, z = код цвета фона). Порядок следования x,y и z не имеет значения, т.к. код определяется по числовому значению, а не по его положению.
- \e[m - конец форматирования текста (необязателен, нужен для сброса форматирования).
Для примера раскрасим строку приглашения, которая имеет вид - PS1="\u@\h:\w\n\$ "
. Зададим яркий фиолетовый цвет (код 95) для имени пользователя и хоста, а также яркий зеленый цвет (код 92) для строки каталога. Текст, который мы хотим раскрасить, нужно поместить между управляющими последовательностями символов \e[x;y;zm
и \e[m
. Тип форматирования и цвет фона задавать не обязательно, в этом случае они будут установлены по умолчанию.
Иногда использование непечатных символов таких как \e
может привести к некорректному поведению строки приглашения, особенно при пролистывании истории команд кнопкой вверх. В связи с этим крайне рекомендуется экранированить все непечатные символы с помощью - \[ \]
.
PS1="\[\e[1;92m\]\u@\h\[\e[m\]:\[\e[1;96m\]\w\[\e[m\]\\$ "
Результат будет следующим.
В представленной ниже таблице вы можете узнать коды доступных цветов для форматирования текста в терминале.
Цвет | Обычный | Яркий | Фон | Яркий фон |
---|---|---|---|---|
Black | 30 | 90 | 40 | 100 |
Red | 31 | 91 | 41 | 101 |
Green | 32 | 92 | 42 | 102 |
Brown/Yellow | 33 | 93 | 43 | 103 |
Blue | 34 | 94 | 44 | 104 |
Magenta | 35 | 95 | 45 | 105 |
Cyan | 36 | 96 | 46 | 106 |
White | (light gray) 37 | 97 | 47 | 107 |
Default color | 39 | 49 |
Также таблица вариантов изменения форматирования текста.
Тип форматирования текста | Код |
---|---|
полная очистка форматирования | 0 |
жирный/яркий текст | 1 |
затемненный цвет теста | 2 |
наклонный текст | 3 |
подчеркнутый текст | 4 |
медленно мерцающий текст | 5 |
быстро мерцающий текст | 6 |
обратить цвет текста в цвет фона | 7 |
спрятанный текст (для паролей) | 8 |
зачеркнутый текст | 9 |
очистка жирности/яркости текста | 21 |
очистка затемнения текста | 22 |
очистка наклона текста | 23 |
очистка подчеркивания текста | 24 |
очистка мерцания текста | 25 |
очистка мерцания текста | 26 |
очистка фона | 27 |
очистка скрытия текста | 28 |
очистка зачеркивания текста | 29 |
Некоторые терминалы не поддерживают различные типы форматирования.
Если вам нужно несколько вариантов форматирования, например жирный, наклонный и подчеркнутый текст одновременно, то вы можете указать несколько кодов форматирования через знак - ;
, например - \e[1;3;4;33;44mTEXT\e[0m
Для полноты картины рассмотрим несколько примеров стилизации строки приглашения.
В конце статьи вы можете ознакомиться с Bash-скриптом, который наглядно покажет как форматирование поддерживается в вашем терминале.
Изменение цвета текста в терминале с помощью управляющих символов (88/256 цветов)
Для терминалов с поддержкой 88/256 цветов используются следующий порядок управляющих символов:
- \e[ - начало форматирования текста.
- w;x;y;zm - код цвета (w = коды форматирования, x = что форматируем текст (код 38) или фон (код 48), y = 5, z = код цвета от 0 до 255). В данном случае важно соблюдать порядок следования для w, x, y и z.
- \e[m - конец форматирования текста (необязателен, нужен для сброса форматирования).
Чтобы для одного и того же текста одновременно задать цвет и фон нужно еще раз указать соответствующую последовательность кодов, например - \e[38;5;124;48;5;20mTEXT\e[0m
Примеры изменения цвета для строки приветствия могут выглядеть следующим образом.
В последнем разделе вы найдете Bash-скрипт, который выведет карту всех 256 цветов в терминале, чтобы вам было удобней определиться с выбором.
Изменение цвета текста в терминале с помощью управляющих символов (16777216 цветов)
Терминалы с поддержкой 24-битной версии управляющих символов ANSI, способны выводить почти полный спектр видимых человеком цветов в формате RGB.
Здесь также как и в двух предыдущих вариантах используются управляющие символы. Только теперь для каждого цвета (красный, зеленый, синий) выделяется по одному байту, т.е. для каждого цвета вы можете задать промежуток от 0 до 255.
- \e[ - начало форматирования текста.
- w;x;y;z1,z2,z3m - код цвета (w = коды форматирования, x = что форматируем текст (код 38) или фон (код 48), y = 2, z1 = RED(0-255), z2 = GREEN(0-255), z3= BLUE(0-255)). В данном случае важно соблюдать порядок следования для w, x, y и z1, z2, z3.
- \e[m - конец форматирования текста (необязателен, нужен для сброса форматирования).
Если вы не используете какой либо из цветов, то его можно не писать, но место под него должно остаться, например чисто синий цвет - \e[1;38;2;;;255m
Несколько примеров использования RGB формата.
Сохранение цветового кода в переменных
Если сильно увлечься с форматированием, то можно получить практически не читаемый код. Для того чтобы избежать излишнего громаждения управляющих символов рекомендую сохранять код каждого цвета в переменную и подставлять ее в нужное место.
Сохранить цвет в переменную можно следующим образом.
Red="\[\e[1;38;5;197m\]"
Blue="\[\e[1;38;5;45m\]"
Clear="\[\e[m\]"
Теперь подставим переменные внутрь PS1
.
PS1="${Red}\u@\h${Clear}:${Blue}\w${Clear}\\$ "
Изменение цвета текста в терминале с помощью команды tput
Цвет можно также задать с помощью команды tput
, которая будет подставлять всё те же управляющие символы.
tput setaf [0-7]
- установка цвета текста
tput setab [0-7]
- установка цвета фона
tput sgr0
- очистка форматирования
Пример использования команды tput
.
Yellow="tput setaf 6"
BgGreen="tput setab 2"
Clear="tput sgr0"
PS1="$(${Yellow})\u@\h$(${Clear}):$(${BgGreen})\w$(${Clear})\\$ "
Коды доступных цветов представлены в таблице ниже.
Цвет | Black | Red | Green | Yellow | Blue | Magenta | Cyan | White |
---|---|---|---|---|---|---|---|---|
Код | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
С помощью tput
можно также задавать стили форматирования.
tput bold # Включить жирность
tput dim # Затемнить текст
tput smul # Включить подчеркивание
tput rmul # Отключить подчеркивание
tput rev # Поменять цвет текста на цвет фона
Команда tput
имеет множество возможностей по управлению текстом и терминалом в целом. Подробнее об этой команде вы можете узнать на справочных страницах.
man 5 terminfo
Как сохранить отформатированную строку приглашения
В этой статье мы подробно рассмотрели все варианты установки цветов для текста в терминале Linux. Чтобы сохранить раскрашенную строку приветствия, то вставьте нужное значение переменной PS1
в конец файла ~/.bashrc
.
vi ~/.bashrc
PS1="\e[1;38;2;0;200;100m\u@\h\e[m:\e[1;38;2;5;222;250m\w\e[m\n$ "
Вы также можете сохранить строку приветствия раскрашенную в градиенте. Для этого вставьте следующий код в файл ~/.bashrc
, измените в нем значение переменной clr
, на номер из палитры 256 цветов, с которого хотите начать градиент.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
str=$USER@$HOSTNAME # Измените эту строку, на свой лад clr=16 # Номер первого цвета в строке цветовой палитры range=5 lack_char=0 if [ -z "$str" ] then echo -e "\e[31mПеременная \$str не должна быть пустой!\e[m" else if [[ ${#str} -gt 11 ]]; then lack_char=$(expr ${#str} - 11) fi for (( i=0,k=1,j=clr,l=clr; i<${#str}; i++,j=j+k,l++ )); do if [[ j -gt ${clr}+${range}-1 ]]; then k=0 fi if [[ l -gt ${clr}+${range}+${lack_char}-1 ]]; then k=-1 fi cPS1="${cPS1}\e[48;5;${j}m${str:$i:1}\e[m" done fi PS1="${cPS1}:\e[1;38;2;5;222;250m\w\e[m\n$ " |
Bash-скрипты для вывода всех доступных цветов терминала
Чтобы вам не пришлось вручную проверять поддержку цветов и форматирование в вашем терминале, я предлагаю вам несколько скриптов для вывода полной цветовой карты.
Вывод цветов и форматирования для терминалов с поддержкой 8\16 цветов
Данный скрипт наглядно продемонстрирует вам все варианты использования цветов и форматирования в вашем терминале с использованием палитры 8/16 цветов.
Создайте пустой файл с именем colormap16.sh
в каталоге /usr/local/sbin
и вставьте в него следующее содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash #Вывод всех вариантов цвета текста, цвета фона и форматирования, #для терминалов с поддержкой 16 цветов. #ФОН for bgclr in {40..47} {100..107} 49 ; do #ТЕКСТ for txtclr in {30..37} {90..97} 39 ; do #ФОРМАТИРОВАНИЕ for txtfrt in 0 1 2 3 4 5 7 8 9; do #Вывод результата echo -en "\e[${txtfrt};${bgclr};${txtclr}m [${txtfrt};${bgclr};${txtclr}m \e[0m\n" done done done exit 0 |
Далее сделайте этот файл исполняемым и запустите его.
chmod a+x /usr/local/sbin/colormap16.sh
/usr/local/sbin/colormap16.sh
Вывод цветовой карты для терминалов с поддержкой 88\256 цветов
Следующий скрипт выведет все номера 256 вариантов цветов в удобной форме, чтобы вам было проще выбрать желаемый цвет.
Создайте пустой файл с именем colormap256.sh
в каталоге /usr/local/sbin
и вставьте в него следующее содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash # Вывод цветовой карты для терминалов с поддержкой 88/256 цветов for bgtxt in 38 48 ; do # 38-код текста, 48-код фона for color in {0..255} ; do # Диапазон доступных цветов # Вывод цветовой палитры printf "\e[${bgtxt};5;%sm %3s \e[0m" $color $color # 6 цветов в строке if [ $((($color + 1) % 6)) == 4 ] ; then echo # Новая строка fi done echo # Новая строка done exit 0 |
Далее сделайте этот файл исполняемым и запустите его.
chmod a+x /usr/local/sbin/colormap256.sh
/usr/local/sbin/colormap256.sh
Вывод текста на фоне градиента
Если установить разный фон для каждого символа в строке, то можно добиться фона, который будет похож на градиент. Для этого нужно брать цвета только из одной строки цветовой карты в порядке их вывода.
Чтобы просмотреть любой текст на фоне градиента воспользуйтесь этим скриптом. Создайте пустой файл с именем gradient.sh
в каталоге /usr/local/sbin
и вставьте в него следующее содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#!/bin/bash #Вывод строки из цветовой палитры в виде фона для каждого символа строки, #переданной в аргументе. #Пример вызова скрипта: gradient.sh $USER@$HOSTNAME str=${1} # Проверка передачи строки текста в качестве аргумента if [[ ${1} = '' ]]; then echo -e "\e[31mВы не указали строку для вывода! Пример: gradient.sh somestring\e[m" exit 1 fi range=5 lack_char=0 col=0 # Расчет количества символов для последующей корректировки градиента if [[ ${#str} -gt 11 ]]; then lack_char=$(expr ${#str} - 11) fi # Начинаем перебор цветов в цветовой палитре for (( clr=16; clr<256; clr+=6 )); do for (( i=0,k=1,j=clr,l=clr; i<${#str}; i++,j=j+k,l++ )); do # Доходим до конца строки в цветовой палитре и идем обратно # Если текст окажется больше количества цветов в строке (12) # То цвет, который будет в середине градиента начнет повторяться if [[ j -gt ${clr}+${range}-1 ]]; then k=0 fi if [[ l -gt ${clr}+${range}+${lack_char}-1 ]]; then k=-1 fi clrtext="${clrtext}\e[48;5;${j}m${str:$i:1}\e[m" # Текст в градиенте done if [[ ${clr} -lt 100 ]]; then # Для аккуратности вывода добавим 0 в начало двухзначных чисел zero=0 else zero='' fi printf " ${zero}${clr}:${clrtext}" # Выводим результат col=$((col+1)) # Счетчик колонок if [[ $(( col % 5 )) = 0 ]]; then # После 5 колонки делаем перенос строки echo fi clrtext="" # Очищаем предыдущий результат done echo #Обратный порядок градиента (с конца в начало) if [[ ${#str} -gt 11 ]]; then lack_char=$(expr ${#str} - 11) fi for (( clr=21; clr<256; clr+=6 )); do for (( i=0,k=1,j=clr,l=clr; i<${#str}; i++,j=j-k,l-- )); do if [[ j -eq ${clr}-${range} ]]; then k=0 fi if [[ l -lt ${clr}-${range}-${lack_char}+1 ]]; then k=-1 fi clrtext="${clrtext}\e[48;5;${j}m${str:$i:1}\e[m" done if [[ ${clr} -lt 100 ]]; then zero=0 else zero='' fi printf " ${zero}${clr}:${clrtext}" col=$((col+1)) if [[ $(( col % 5 )) = 0 ]]; then echo fi clrtext="" done exit 0 |
Результат выполнения скрипта gradient.sh
Заключение
В данной статье мы подробно ознакомились с тем, как можно стилизовать текст строки приглашения в терминале. Главное помните, что стилизовать можно абсолютно любой текст в том числе символы юникода. Использование форматированного теста может отлично пригодится при создании Bash-скриптов, т.к. с помощью цвета вы можете обратить внимание пользователя на ошибки и предупреждения, а также упростить визуальное восприятие информации.