Цветной man или как разукрасить вывод echo

    Когда пишешь даже минимальный скриптик, часто используешь echo — подсказки.
    Согласитесь "цветной man" ведь намного приятнее читать, так почему бы не раскрасить вывод echo?
    это достаточно легко.
    Итак…

    Задача:
    Раскрасить текстовую строку выводимую на экран через команду echo
    т.е. раскрасить эти самые подсказки

    Что нужно:
    1) man echo
    www.opennet.ru/man.shtml?topic=echo&category=1

    Из него нам пригодится точно

    echo -e   # ключ -e в комманде echo включает отображение "backslash escapes"; например \n - переход на следующую строку, \t -табуляция
    echo -n   # ключ -n в команде echo сигнализирует, что после вывода информации не нужно переходить на следующую строку.
    echo -en   # в нашем случае поможет раскрасить вывод текста.




    2) Хорошая статья с примерами «Управление консолью Linux» RUS
    c-reaction.net/content/204

    Хорошая статья с примерами «Colorizing Scripts» ENG
    www.faqs.org/docs/abs/HTML/colorizing.html

    Поехали:

    Для начала одним глазом хотябы посмотрим на man echo rus, а потом рассмотрим как использовать цвет
    www.opennet.ru/man.shtml?topic=echo&category=1

    Переходим к Управлению цветом:

    tput sgr0    Возврат цвета в "нормальное" состояние

    \033[0m    все атрибуты по умолчанию
    \033[1m    жирный шрифт (интенсивный цвет)
    \033[2m    полу яркий цвет (тёмно-серый, независимо от цвета)
    \033[4m    подчеркивание
    \033[5m    мигающий
    \033[7m    реверсия (знаки приобретают цвет фона, а фон -- цвет знаков)

    \033[22m    установить нормальную интенсивность
    \033[24m    отменить подчеркивание
    \033[25m    отменить мигание
    \033[27m    отменить реверсию

    \033[30    чёрный цвет знаков
    \033[31    красный цвет знаков
    \033[32    зелёный цвет знаков
    \033[33    желтый цвет знаков
    \033[34    синий цвет знаков
    \033[35    фиолетовый цвет знаков
    \033[36    цвет морской волны знаков
    \033[37    серый цвет знаков

    \033[40    чёрный цвет фона
    \033[41    красный цвет фона
    \033[42    зелёный цвет фона
    \033[43    желтый цвет фона
    \033[44    синий цвет фона
    \033[45    фиолетовый цвет фона
    \033[46    цвет морской волны фона
    \033[47    серый цвет фона



    Таблица цветов и фонов:
    Цвет        код       код фона

    black        30  40    \033[30m  \033[40m
    red        31  41    \033[31m  \033[41m
    green      32  42    \033[32m  \033[42m
    yellow      33  43    \033[33m  \033[43m
    blue        34  44    \033[34m  \033[44m
    magenta      35  45    \033[35m  \033[45m
    cyan        36  46    \033[36m  \033[46m
    grey        37  47    \033[37m  \033[47m



    Допускается объединение этих управляющих последовательностей.
    Например \033[1m\033[5m\033[36m может быть заменено эквивалентной последовательностью \033[1;5;36m.

    Пример:
    #!/bin/sh
    #
    # скрипт выводит на экран сообщение с использованием цвета
    #
    echo -en "\033[37;1;41m Внимание \033[0m"




    Еще пример:
    #!/bin/sh
    #
    # скрипт запускает копию командного интерпретатора sh
    # с цветным приглашением
    #
    export PS1="\[\033[1;30m\][\[\033[0m\]\t\[\033[1;30m\];\
    \[\033[0m\]\W\[\033[1;30m\]]\[\033[36;1m\]|\[\033[0m\] "

    echo "Now runing a new copy of shell width color prompt"
    echo -en "use \033[1;36mexit\033[0m command or"
    echo -e "\033[1;36m^D\033[0m to return back"
    sh
    #
    # обратите внимание на то, что управляющие последовательности
    # заключены в скобки "\[" и "\]"
    # Это сделано для того, чтобы shell не учитывал их при
    # оценке длины строки.
    # В противном случае длинные строки будут переноситься неверно.
    #




    Для удобства пользвания можно цвет и доп. свойства назначить переменным:
    RED='\033[0;31m'         #  ${RED}
    GREEN='\033[0;32m'      #  ${GREEN}




    Файл .sh должен быть в формате UNIX и с кодировкой UTF-8

    Ну и напоследок — один хороший пример со всеми плюшками:
    #!/bin/sh
    # echo подсветка
    # echo color
    # Скрипт выводит на экран список меню

    clear    # Очистка экрана

    #Памятка, Таблица цветов и фонов
    #Цвет           код       код фона

    #black    30  40    \033[30m  \033[40m
    #red      31  41    \033[31m  \033[41m
    #green    32  42    \033[32m  \033[42m
    #yellow    33  43    \033[33m  \033[43m
    #blue    34  44    \033[34m  \033[44m
    #magenta    35  45    \033[35m  \033[45m
    #cyan    36  46    \033[36m  \033[46m
    #white    37  47    \033[37m  \033[47m

    # Дополнительные свойства для текта:
    BOLD='\033[1m'       #  ${BOLD}      # жирный шрифт (интенсивный цвет)
    DBOLD='\033[2m'      #  ${DBOLD}    # полу яркий цвет (тёмно-серый, независимо от цвета)
    NBOLD='\033[22m'      #  ${NBOLD}    # установить нормальную интенсивность
    UNDERLINE='\033[4m'     #  ${UNDERLINE}  # подчеркивание
    NUNDERLINE='\033[4m'     #  ${NUNDERLINE}  # отменить подчеркивание
    BLINK='\033[5m'       #  ${BLINK}    # мигающий
    NBLINK='\033[5m'       #  ${NBLINK}    # отменить мигание
    INVERSE='\033[7m'     #  ${INVERSE}    # реверсия (знаки приобретают цвет фона, а фон -- цвет знаков)
    NINVERSE='\033[7m'     #  ${NINVERSE}    # отменить реверсию
    BREAK='\033[m'       #  ${BREAK}    # все атрибуты по умолчанию
    NORMAL='\033[0m'      #  ${NORMAL}    # все атрибуты по умолчанию

    # Цвет текста:
    BLACK='\033[0;30m'     #  ${BLACK}    # чёрный цвет знаков
    RED='\033[0;31m'       #  ${RED}      # красный цвет знаков
    GREEN='\033[0;32m'     #  ${GREEN}    # зелёный цвет знаков
    YELLOW='\033[0;33m'     #  ${YELLOW}    # желтый цвет знаков
    BLUE='\033[0;34m'       #  ${BLUE}      # синий цвет знаков
    MAGENTA='\033[0;35m'     #  ${MAGENTA}    # фиолетовый цвет знаков
    CYAN='\033[0;36m'       #  ${CYAN}      # цвет морской волны знаков
    GRAY='\033[0;37m'       #  ${GRAY}      # серый цвет знаков

    # Цветом текста (жирным) (bold) :
    DEF='\033[0;39m'       #  ${DEF}
    DGRAY='\033[1;30m'     #  ${DGRAY}
    LRED='\033[1;31m'       #  ${LRED}
    LGREEN='\033[1;32m'     #  ${LGREEN}
    LYELLOW='\033[1;33m'     #  ${LYELLOW}
    LBLUE='\033[1;34m'     #  ${LBLUE}
    LMAGENTA='\033[1;35m'   #  ${LMAGENTA}
    LCYAN='\033[1;36m'     #  ${LCYAN}
    WHITE='\033[1;37m'     #  ${WHITE}

    # Цвет фона
    BGBLACK='\033[40m'     #  ${BGBLACK}
    BGRED='\033[41m'       #  ${BGRED}
    BGGREEN='\033[42m'     #  ${BGGREEN}
    BGBROWN='\033[43m'     #  ${BGBROWN}
    BGBLUE='\033[44m'     #  ${BGBLUE}
    BGMAGENTA='\033[45m'     #  ${BGMAGENTA}
    BGCYAN='\033[46m'     #  ${BGCYAN}
    BGGRAY='\033[47m'     #  ${BGGRAY}
    BGDEF='\033[49m'      #  ${BGDEF}

    tput sgr0     # Возврат цвета в "нормальное" состояние

    #Начало меню
    echo ""
    echo -n "     "
    echo -e "${BOLD}${BGMAGENTA}${LGREEN} Меню DNS323 ${NORMAL}"
    echo ""
    echo -en "${LYELLOW} 1 ${LGREEN} Комманды для удобной работы в telnet ${GRAY}(Выполнить?)${NORMAL}\n" 
    echo ""
    echo -en "${LYELLOW} 2 ${LGREEN} Пути к папкам & Изменение прав доступа ${GRAY}(Комманды)${NORMAL}\n" 
    echo ""
    echo -en "${LYELLOW} 3 ${LGREEN} Transmission (${GREEN}Start${NORMAL}, ${LRED}Stop${NORMAL}, ${CYAN}Upgrade${NORMAL}) ${GRAY}(Меню)${NORMAL}\n" 
    echo ""
    echo -en "${LYELLOW} 4 ${LGREEN} Копирование (cp & rsync) ${GRAY}(Комманды)${NORMAL}\n"
    echo ""
    echo -en "${LYELLOW} 5 ${LGREEN} Создание ссылки на файл или папку ${GRAY}(Комманды)${NORMAL}\n"
    echo ""
    echo -en "${LYELLOW} 6 ${LGREEN} Установка из fun-plug & IPKG ${GRAY}(Комманды)${NORMAL}\n"
    echo ""
    echo -en "${LYELLOW} 7 ${LGREEN} Показать Трафик (${LYELLOW} n${LGREEN}load) ${GRAY}(Выполнить?)${NORMAL}\n"
    echo ""
    echo -en "${LYELLOW} 8 ${LGREEN} Диспетчер задач (${LYELLOW} h${LGREEN}top) ${GRAY}(Выполнить?)${NORMAL}\n"
    echo ""
    echo -en "${LYELLOW} 9 ${LGREEN} Midnight Commander (${LYELLOW} m${LGREEN}c) ${GRAY}(Выполнить?)${NORMAL}\n"
    echo ""
    echo -en "${LMAGENTA} q ${LGREEN} Выход ${NORMAL}\n"
    echo ""
    echo "(Введите пожалуйта номер пункта, чтобы выполнить комманды этого пункта, любой другой ввод, Выход)"
    echo ""
    tput sgr0



    ps: Подскажите, пожалуйста, в какой блог лучше опубликовать?

    UPD1: перенес в Linux для всех, т.к. это наиболее близкий блог по тематике, как мне кажется.
    UPD2: Спасибо aco за картинку, кратко и наглядно =)
    image
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 34

      +2
      Существует замечательный проект cwrapper, который навешивает обработчики на самые частоиспользуемые (с точки зрения автора проекта), разукрашивая их вывод.
        0
        Ужасный пакет. Странная логика работы. можно сидеть полчаса тыкать ifconfig и он будет весь вывод красить в один цвет(но каждый раз разный.), хрень в общем. свои скрипты я разукрашиваю, как в статье.
          0
          Свои скрипты, конечно, лучше красить таким методом, который указан в статье (cwrapper — это всё-таки стороннее приложение). А для уже существующего набора команд из окружения такие обвертки самому писать несколько накладно, гораздо проще использовать уже готовый.
            +2
            За то, что написано в статье, надо активно применять силовые методы воздействия к тем, кто такое советует.

            Бывают терминалы, сильно отличные от тех, управляющие последовательности которых вбиты в показанные скрипты. Базы termcap/terminfo делались умными людьми не просто так, а именно для этих случаев. И, внезапно, есть вполне себе штатный способ работы с ними из шелл-скриптов: tput. Например:

            BOLD=$(tput bold)
            NORMAL=$(tput sgr0)
            
            echo "${BOLD}Заголовок${NORMAL} - подзаголовок"
            


            Во многих SysVinit-based Linux-дистрибутивах, кстати, есть файлик /etc/init.d/outformat или какой-то похожий на него. Там именно такими конструкциями инициализируются переменные, значения которых потом используются для рисования цветных надписей типа "[ OK ]" и "[FAILED]" при загрузке/остановке системы.
        +5
        На работе ведем несколько проектов и под каждый проект есть отдельный сервер депелопер и продакшн. Часто открыто сразу несколько консолей и чтобы не запутаться выделяю заголовок и цвет:

        На девелопере в ~/.bashrc

        # User specific aliases and functions
        PROMPT_COMMAND='printf "\033]2;%s@:%s\007" "Developer %projectname%" "${PWD/#$HOME/~}"'
        PS1="\[\033[0;33m\][\u@\h \W]\$ \[\033[0m\]"



        Продакшн:
        # User specific aliases and functions
        PROMPT_COMMAND='printf "\033]2;%s@:%s\007" "Production %projectname%" "${PWD/#$HOME/~}"'
        PS1="\[\033[0;31m\][\u@\h \W]\$ \[\033[0m\]"
         


        Т.о. консоли различаются по цвету (девелопер-желтый, продакшн-красный) и по заголовку (Developer %projectname% и Production %projectname%)
        • UFO just landed and posted this here
          +5
          Цветной echo, это замечательно, но в статье небыло про ман. У меня расскрашивается так:
          export LESS_TERMCAP_mb=$'\E[01;31m'
          export LESS_TERMCAP_md=$'\E[01;31m'
          export LESS_TERMCAP_me=$'\E[0m'
          export LESS_TERMCAP_se=$'\E[0m'
          export LESS_TERMCAP_so=$'\E[01;44;33m'
          export LESS_TERMCAP_ue=$'\E[0m'
          export LESS_TERMCAP_us=$'\E[01;32m'

          взял вот отсюда
            0
            sudo apt-get install most
            export MANPAGER="/usr/bin/most"

              +1
              тогда уж vimpager
              +3
              Вот именно этого я ждал от топика судя по его заголовку! Большой плюс!
                0
                Я исправлюсь =)
                В следующей статье напишу как его использовать для написания мана.
              • UFO just landed and posted this here
                0
                > echo -e # в нашем случае поможет раскрасить вывод текста :)

                Видимо, имелось в виду echo -en
                  0
                  Именно. Спасибо, поправил.
                  0
                  Кстати я когда-то писал скриптик для этого на питоне.
                  • UFO just landed and posted this here
                    • UFO just landed and posted this here
                      +1
                      Использую шпаргалку, найденную в просторах интернета
                      showcolors.sh:
                      #!/bin/bash
                      echo -e "\033[00;30m 00;30m \033[00m \033[02;30m 02;30m \033[00m \033[01;30m 01;30m \033[00m \033[01;40m 01;40m \033[00m"
                      echo -e "\033[00;31m 00;31m \033[00m \033[02;31m 02;31m \033[00m \033[01;31m 01;31m \033[00m \033[01;41m 01;41m \033[00m"
                      echo -e "\033[00;32m 00;32m \033[00m \033[02;32m 02;32m \033[00m \033[01;32m 01;32m \033[00m \033[01;42m 01;42m \033[00m"
                      echo -e "\033[00;33m 00;33m \033[00m \033[02;33m 02;33m \033[00m \033[01;33m 01;33m \033[00m \033[01;43m 01;43m \033[00m"
                      echo -e "\033[00;34m 00;34m \033[00m \033[02;34m 02;34m \033[00m \033[01;34m 01;34m \033[00m \033[01;44m 01;44m \033[00m"
                      echo -e "\033[00;35m 00;35m \033[00m \033[02;35m 02;35m \033[00m \033[01;35m 01;35m \033[00m \033[01;45m 01;45m \033[00m"
                      echo -e "\033[00;36m 00;36m \033[00m \033[02;36m 02;36m \033[00m \033[01;36m 01;36m \033[00m \033[01;46m 01;46m \033[00m"
                      echo -e "\033[00;37m 00;37m \033[00m \033[02;37m 02;37m \033[00m \033[01;37m 01;37m \033[00m \033[01;47m 01;47m \033[00m"
                        0
                        может кто то подскажет библиотеку для интерпретирования ESC последовательностей, чтобы в своей программе текст разобрать и вывести как надо?
                        • UFO just landed and posted this here
                            0
                            вообще хотелось бы парсер сделать для вьювера в mc. Другими словами на си.
                            • UFO just landed and posted this here
                          +2
                          Чтобы иметь цветные маны без магии, достаточно заменить less на most.
                            0
                            Вы меня опередили :) most наше все!
                            +1
                            Я бы добавил в пост
                            0
                            Есть утилитка grc для раскраски вывода разных команд, в составе есть конфиги (на базе регулярных выражений) для многих базовых команд, можно писать свой конфиг и раскрашивать что угодно.
                              0
                              или же ccze
                                0
                                Забыл пояснить что для раскраски логов
                                  0
                                  ccze в принципе входной поток раскрашивает, но для логов лучше всего подходит, да, жаль только нельзя гибко настраивать логику раскраски…
                              0
                              много таких статей уже видел, но вот столкнулся с траблой, которую они не решают: есть сброс настроек в первоначальное положение, а как задать этот первоначальный цвет? У меня в tcsh после некоторых манипуляций стандартным становится зелёный цвет, и для его изменения на обычный серый надо закрывать терминал
                                0
                                Как вариант — в конце всех манипуляций задавать те цвета, которые для вас есть стандартны. Понимаю, что это костыль.
                                Пробую искать более красивое решение.
                                  0
                                  Вы знаете, посмотрел я, не нашел как сохранить первоначальный цвет. Более того
                                  tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html
                                  tput sgr0 Turn off all attributes (doesn't work quite as expected)

                              Only users with full accounts can post comments. Log in, please.