5 окт. 2008 г.

Цветной вывод в bash

Иногда для собственных скриптов бывает удобно сделать цветной вывод текста - для выделения важных моментов и удобства чтения. Средствами bash сделать это можно несколькими путями, я выбрал для себя наиболее удобный и элегантный.

Цветной вывод
Мне часто бывает нужно выделять определенные строки цветом, так что я просто создал файл /etc/colors следующего содержания:

#!/bin/sh
c_std=""
c_h_std=""
c_pink=""
c_h_pink=""
c_red=""
c_h_red=""
c_cayan=""
c_h_cayan=""
c_yellow=""
c_green=""
c_h_green=""
c_blue=""
c_h_blue=""

В нем задаются переменные, хранящие в себе соответствующие своим названиям цвета. Так, например, "c_std" - стандартный цвет текста в терминале; "c_h_std" - он же, но более "жирное" начертание, и т.д.

Этот файл можно использовать в скриптах для цветного вывода. Например:
#!/bin/bash
. /etc/colors

echo "${c_green}Это зеленый цвет${c_std}"


Цветное приглашение bash
Здесь в принципе идея та же, только у меня цвета прописаны в самом bashrc - так уж повелось. Приведу часть своего basrc, отвечающую за приглашение, там все и так довольно очевидно:
bash_prompt() {
local NONE="\[\033[0m\]" # unsets color to term's fg color

# regular colors
local K="\[\033[0;30m\]" # black
local R="\[\033[0;31m\]" # red
local G="\[\033[0;32m\]" # green
local Y="\[\033[0;33m\]" # yellow
local B="\[\033[0;34m\]" # blue
local M="\[\033[0;35m\]" # magenta
local C="\[\033[0;36m\]" # cyan
local W="\[\033[0;37m\]" # white

# emphasized (bolded) colors
local EMK="\[\033[1;30m\]"
local EMR="\[\033[1;31m\]"
local EMG="\[\033[1;32m\]"
local EMY="\[\033[1;33m\]"
local EMB="\[\033[1;34m\]"
local EMM="\[\033[1;35m\]"
local EMC="\[\033[1;36m\]"
local EMW="\[\033[1;37m\]"

# background colors
local BGK="\[\033[40m\]"
local BGR="\[\033[41m\]"
local BGG="\[\033[42m\]"
local BGY="\[\033[43m\]"
local BGB="\[\033[44m\]"
local BGM="\[\033[45m\]"
local BGC="\[\033[46m\]"
local BGW="\[\033[47m\]"

case $TERM in
xterm*|rxvt*)
if [ `echo $SSH_CLIENT | wc -c` -gt 1 ]; then SSH_FLAG=1; fi
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if ([ "$SSH_FLAG" = 1 ] && [ "$ROOT_FLAG" = 1 ]); then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$SSH_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;[SSH] \u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
elif [ "$ROOT_FLAG" = 1 ]; then
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
local TITLEBAR='\[\033]0;\u@\h\007\]'
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
*)
if [ `/usr/bin/whoami` = "root" ]; then ROOT_FLAG=1; fi
if [ "$ROOT_FLAG" = 1 ]; then
PS1="$TITLEBAR${R}[!] ${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
else
PS1="$TITLEBAR${G}\u${Y}@\h ${W}at ${C}\W ${W}>:/ "
fi
;;
esac
}

bash_prompt

Внимательный читатель заметит, что также присутствует проверка на то, является ли текущая сессия сессией ssh и/или рутовой сессией. Соответственно устанавливаются флаги SSH_FLAG и ROOT_FLAG и определенным образом меняется приглашение. Пример:

4 комментария:

Анонимный комментирует...

это что за символ?

Анонимный комментирует...

Всем привет
Большое спасибо за информацию, очень спасло. Вы представляете хороший сайтик с адекватной статистикой =)
Задумываюсь о покупке сообщения на этом портале. дешево такси www.taxisat.ru (Москва) Внизу и можно справа в топиках. Ну или каких-нибудь других видных рекламных условий.
Возможно по тематике вашего сайта подойдёт для рекламы сайт перепланировка квартир www.buro-pereplanirovok.ru для этого проекта могу заказать более дорогостоящие статьи и обзоры.
Поясните, где заказать, какие правила тут?
Хочу длительное время размещать рекламные места, платные темы и др. надеюсь эти сайты подойдут для вашей цены.
Я покупала банеры на разных порталах всего за 3900 руб. в месяц за статьи.
Я предлогаю 80$ в месяц за 1 банер вверху

Ещё рассмотрю предложения по [b]заказу[/b] и покупке статей на вашем сайте. Куплю дорого!

P.S. Очень надеюсь на выгодное долгосрочное сотрудничество. Большое спасибо, жду ваших электронных ответов желательно с требованиями и ценами.

Анонимный комментирует...

Поздравляю вас Старо-Новым годом, желаю вам в новом году успехов и спасибо что вы находите время поддерживать ваш замечательный блог!

Анонимный комментирует...

Приятно удивился некой "красоте", аккуратности решения.

Для ещё большей лени в /etc/colors можно определить функции наподобие:
green(){
echo "${c_green}$@${c_std}"
}

И потом использовать так:
green "Зелёный цвет";