Если слово «консоль» у Вас ассоцируется с чёрным окном и серыми буковками, то эта статья для Вас! :) В данной статье описано, как использовать цвета при выводе текста, а также управлять положением курсора. В качестстве примера я приведу скрипт цветного прогрессбара, который выводит процент выполнения в виде увеличивающейся строки и текущего значения справа.
Управление консолью, окном терминала и прочим хозяйством всегда начинается с вывода управляющего символа, т.н. Escape-символа. Его ASCII-код равен 27, при редактировании он обычно показывается как ^[
. Однако, это непечатаемый символ и в консоли его просто так не ввести.
Чтобы обойти проблему ввода, необходимо прибегнуть к помощи тех команд, которые умеют расширять переданные им строки, заменяя код символа на сам символ. В консоле фрибсд есть, как минимум, две такие команды — встроенная echo -e
в /bin/sh
и утилита /usr/bin/printf
. Выглядит это так:
Вывод управляющего символа Escape |
# Интерпритатор /bin/sh echo -e "\033" # Вывод escape-символа с помощью printf printf "\033" |
После escape-символа уже идут непосредственно команды на управление терминалом (консоль, ssh-клиент и т.д.). В общем случае это выглядит примерно так:
Вывод красной надписи |
# Команда выведет ярко-красную надпись «Hello» на чёрном фоне printf "\033[1;31mHello\033[m\n" |
Вот так интерпретируется строка, выведенная printf
:
\033[1;31m
Hello
\033[m
\n
Модификатор цвета задаётся с помощью конструкции [#m
, где # — номер цвета или последовательность номеров, разделённых точкой с запятой.
Аттрибуты | |
---|---|
\033[m | отмена модификаторов цвета |
\033[0m | отмена модификаторов цвета |
\033[1m | яркий |
\033[4m | подчёркнутый в PUTTY, яркий в FreeBSD |
\033[5m | светлый в PUTTY, без эффекта в FreeBSD |
\033[7m | инверсия |
Непонятно что | |
\033[12m | после этого консоль PUTTY превратится в стадо кракозябр... |
\033[21m | подчёркнутый в PUTTY, без эффекта в FreeBSD |
Цвет символов | |
\033[30m | чёрный шрифт |
\033[31m | красный шрифт |
\033[32m | зелёный шрифт |
\033[33m | жёлтый шрифт в PUTTY, коричневый в FreeBSD (если не яркий) |
\033[34m | синий шрифт |
\033[35m | малиновый шрифт |
\033[36m | голубой шрифт |
\033[37m | серый шрифт |
Цвет фона | |
\033[40m | чёрный фон |
\033[41m | красный фон |
\033[42m | зелёный фон |
\033[43m | жёлтый фон в PUTTY, коричневый в FreeBSD |
\033[44m | синий фон |
\033[45m | малиновый фон |
\033[46m | голубой фон |
\033[47m | серый фон |
Для большей наглядности я сформировал сводную таблицу цветов в файле color-freebsd.txt. Приведу скриншоты для PUTTY и FreeBSD.
Сводная таблица цветов для PUTTY
Сводная таблица цветов для FreeBSD
В ячейках таблицы указаны параметры модификатора, которые нужно использовать, чтобы добиться того же цвета, как у ячейки.
Примеры цветного вывода |
printf "\033[33;1mЯрко-жёлтая надпись\033[m\n" printf "\033[1;42mЯрко-белая надпись на зелёном фоне\033[m\n" printf "\033[1;42;7;5mЯрко-зелёная надпись на ярко-белом фоне (только для PUTTY)\033[m\n" |
Не стоит забывать, что модификаторы цвета можно группировать, используя точку с запятой в качестве разделителя. Также, после окончания цветного вывода, очень желательно сбросить модификаторы, чтобы вернуть консоль в исходное состояние.
\033[#A | передвинуть курсор вверх на # позиций |
\033[#B | передвинуть курсор вниз на # позиций |
\033[#C | передвинуть курсор вправо на # позиций |
\033[#D | передвинуть курсор влево на # позиций |
\033[#E | передвинуть курсор вниз на # позиций и поставить в начало строки |
\033[#F | передвинуть курсор вверх на # позиций и поставить в начало строки |
\033[#G | передвинуть курсор в позицию # текущей строки (работает только в PUTTY) |
\033[#;#H | поместить курсор по указанным координатам |
Примеры вывода текста с модификаторами положения курсора |
printf "\033[20;20HHello\n" printf "\033[1E\033[20CHello,\033[1Aworld\033[2E" |
Подводя итог данной статьи, я приведу пример реализации графической полосы прогресса средствами /bin/sh
.
Код - пример реализации полосы прогресса | |
1 |
#!/bin/sh # Функция, которая выводит полосу прогресса progressBar() { progress=$(( $1 * 30 / 100 )) bar=`printf "\33[41m% ${progress}s\33[m" ""` printf "\33[37D[%- 38s] %- 4s" "${bar}" "$1%" } # Счётчик процентов i=0 # Надпись со смещением курсора вправо на длину полосы прогресса printf "Format C: \33[37C" # Цикл по процентам while [ $i -le 100 ]; do progressBar $i i=$(( $i + 1 )) done # Поскольку progressBar не переводит курсор на новую строку, то делаем это сами после вывода всего прогресса echo |
В работе это выглядит примерно так:
Честно скажу, что не стал заморачиваться с точными формулами расчёта координат полосы прогресса и все цифры подобрал «на глазок». Но принцип тут используется двольно простой — исходя из процента, в переменную $bar
записывается графическая часть прогресса (красная полоса), которая потом выравнивается по правому краю на длину всей полосы. При этом каждый раз при выводе идёт смещение влево на длину всего прогрессбара, чтобы обеспечить статичный вид.
Если есть вопросы или пожелания, то можете писать сюда или на форум. И удачного колоризинга консоли :)
PS: Если вдруг захотите разместить какие-либо материалы из данной статьи у себя на сайте, пожалуйста, не забудьте дать ссылку на этот сайт, как первоисточник.