Добавление цвета в Shell -- использование кодов ANSI
ArticleCategory: Hardware
SystemAdministration
AuthorImage:[Here we need a little image from you]
TranslationInfo:[Author + translation history. mailto: or
http://homepage]
original in de Nico Golde
de to en Jürgen Pohl
en to ru Пухляков Кирилл
AboutTheAuthor:[A small biography about the author]
В настоящее время Nico является студентом. Уже несколько лет он
серьезно увлекается Linux, еще он принимает участие в нескольких проектах
Open Source.
Abstract:
На ANSI совместимых терминалах (таких как xterm, rxvt, konsole ...)
текст может быть отображен в цвете. В этой заметке мы и поговорим об этом.
ArticleIllustration:
ArticleBody:
Введение
В реальной жизни каждый пользователь Linux прибегает к услугам Bash.
Выглядит конечно shell скучновато, но это можно изменить и сделать его
более привлекательным. Например сделав приглашение shell в цвете.
В этой заметке я буду рассказывать применительно к Bash shell. Управляющие
последовательности могут различаться в разных терминалах, мы будем рассматривать
ANSI терминал.
Настройка Shell'а
Настройка цвета для shell'а осуществляется посредством персонального
конфигурационного файла ~/.bashrc или глобального файла /etc/bashrc.
Приглашение shell'а устанавливается переменной PS1 в bashrc.
В общем случае это выглядит следующим образом:
~/.bashrc: PS1="\s-\v\$ "
\s - это название shell'а, а -\v - его версия. В конце мы поставили символ $.
Почти во всех дистрибутивах Linux используется следующий вариант:
~/.bashrc: PS1="\u@\h \w \$ "
|
Т.е. - пользователь - текущий каталог и $.
Управляющие последовательности
Чтобы раскрасить приглашение можно использовать управляющие последовательности
символов, которые являются не чем иным как инструцией shell'у выполнить какое-либо
действие. Управляющая последовательность обычно начинается с ESC ( в shell'е это выглядит
как ^[ или \033 - ESC это 27 в десятичной и 33 в шестнадцатиричной ).
Для использования управляющей последовательности непосредственно в shell'е
необходимо вначале набрать ctrl-v: CTRL-v ESC.
Использование цвета в Shell'е
Рассмотрим использование цвета на примере приглашения.
~/.bashrc: PS1="\[\033[0;32;40m\u@\h:\w\$ \]"
Приглашение будет выведено зеленым цветом:
Управляющая последовательность начинается с \033, с [ начинается
определение цвета. Цифра 0 определяет ширину шрифта по умолчанию,
другие возможности опишу позже. Чтобы предотвратить отображение
управляющей последовательности на дисплее необходимо заключить
строку в \[ и \].
Далее определяем цвет шрифта ( в нашем примере это 32 - зеленый ).
Цвет фона - 40 ( черный ). Чтобы текст после приглашения не печатался
зеленым закрываем управляющую последовательность символами \033[0m -
цветом shell'а по умолчанию. Для раскраски шрифта и фона можно
использовать 8 цветов.
Красный, зеленый, желтый, синий, пурпурный, бирюзовый и белый. Коды для
этих цветов следующие: 30 (черный), 31 (красный), 32 (зеленый), 33
(желтый), 34 (синий), 35 (пурпурный), 36 (бирюзовый), 37 (белый).
Цвет для фона определяется теми же кодами, но вместо '3' используется
'4': 40, 41, 42, 43, 44, 45, 46, 47.
Пример:
~/.bashrc: PS1="\[\033[0;37;44m\u@\033[0;32;43m\h:\033[0;33;41m\w$\033[0m\]"
Получается цветное приглашение:
Протестировать эту настройку можно набрав export PS1="string",
позже мы поместим это в .bashrc. Я использую приглашение следующего
вида:
PS1="\[\033[1;34;40m[\033[1;31;40m\u@\h:\w\033[1;34;40m]\033[1;37;40m $\033[0;37;0m\] "
Свойства текста
Как мы увидели раньше, '0' в начале последовательности обозначает
установки для текста приглашения shell. Существуют следующие варианты:
0, 1, 22, 4, 24, 5, 25, 7, 27 со следующими значениями: "по умолчанию",
"выделенный", "не выделенный", "с подчеркиванием", "без подчеркивания",
"мерцающий", "не мерцающий", "инвертированный", "не инвертированный".
С помощью следующего небольшого скрипта мы можем посмотреть на различные
комбинации.
#!/bin/sh
############################################################
# Nico Golde <nico(at)ngolde.de> Homepage: http://www.ngolde.de
# Last change: Mon Feb 16 16:24:41 CET 2004
############################################################
for attr in 0 1 4 5 7 ; do
echo "----------------------------------------------------------------"
printf "ESC[%s;Foreground;Background - \n" $attr
for fore in 30 31 32 33 34 35 36 37; do
for back in 40 41 42 43 44 45 46 47; do
printf '\033[%s;%s;%sm %02s;%02s ' $attr $fore $back $fore $back
done
printf '\n'
done
printf '\033[0m'
done
Вы можете загрузить этот скрипт tar.gz здесь:
showansicol.tar.gz
Еще одно приложение
Возможность устанавливать цвета в shell'е можно использовать для
написания консольных приложений.
Для использования цвета в приложениях необходимо использовать
такие библиотеки как slang или ncurses, что увеличит
размер исполняемого файла. Библиотека Ncurses имеет преимущество
независимости от типа используемого терминала.
Примеры на C
Приложение 'Hello World' зеленым цветом:
#include <stdio.h>
int main(void){
const char *const green = "\033[0;40;32m";
const char *const normal = "\033[0m";
printf("%sHello World%s\n", green, normal);
return 0;
}
Еще одна полезная управляющая последовательность printf("\033[2J"),
это замена system(clear), но без необходимости использования
заголовочного файла unistd.h.
Вот так printf("\033[1K") можно удалить строку.
Примеры init-скриптов
Если мы хотим получить цветное, хорошо читаемое подтверждение
загрузки init скриптов, вместо '.' нам необходимо
опять воспрользоваться упраляющими последовательностями.
Вот отрывок из cron init script:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start) echo -n "Starting periodic command scheduler: cron"
start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "."
;;
Успешное начало cron будет показано точкой. Можно
изменить немного команду echo используя управляющие
последовательности:
#!/bin/sh
# Start/stop the cron daemon.
test -f /usr/sbin/cron || exit 0
case "$1" in
start) echo -n "Starting periodic command scheduler: cron"
start-stop-daemon --start --quiet --exec /usr/sbin/cron
echo "\[ \033[1;34;40m[ \033[1;32;40mOk \033[1;34;40m]\033[0m\]"
;;
Обратная связь
Замечания, ошибки и т.д. направляйте по адресу "nico at ngolde.de".
Удачи...