Ёлочка в командной строке

    Скоро Новый Год, думать о серьёзной работе уже не хочется.

    Все стараются что-нибудь украсить к празднику: дом, офис, рабочее место… Давайте и мы что-нибудь украсим! Например, приглашение командной строки. В какой-то мере командная строка – тоже рабочее место.

    В некоторых дистрибутивах она уже «украшена»:



    В других – она серая и неприметная:



    А мы можем сделать, например, вот так:



    Конечно, на вкус и цвет все фломастеры разные. Если подобная раскраска кажется вам аляповатой и неуместной, то знайте, что данная точка зрения имеет полное право на жизнь. А если вам тоже хочется добавить немного новогоднего настроения, читайте далее небольшую новогоднюю статью от Cloud4Y.


    Для начала поясню, как «раскрашивается» вывод терминала. Делается это при помощи escape-последовательностей. А если точнее – управляющих кодовых последовательностей терминала ANSI/VT100. Что автоматически означает, что ваш эмулятор терминала должен этот стандарт поддерживать, иначе новогоднего чуда не случится. И да, предполагается, что $SHELL у вас bash.

    Escape-последовательностями эти команды называют по той причине, что в начале каждой из них идёт ASCII-символ «escape». Управляющих последовательностей много, и они позволяют, к примеру, выводить настройки терминала, управлять отображением и перемещением курсора, изменять шрифт, удалять и скрывать текст. Мы же из всего разнообразия возможностей выберем одну – изменение цвета текста и фона.

    Выполняем кодовую последовательность *ESC*[{attr1};...;{attrn}m
    В качестве символа Escape используется его восьмеричная форма, то есть \033. Что касается атрибутов, то вот краткий перечень возможных значений:

    0 Сбросить все атрибуты
    1 Bright (повышенная яркость)
    2 Dim (затемнение)
    4 Underscore (нижнее подчеркивание)
    5 Blink (мигание)
    7 Reverse (инверсия)
    8 Hidden (скрыть текст)

    Foreground Colours (цвет пера, этим цветом выводится текст):
    30 Black (черный)
    31 Red (красный)
    32 Green (зеленый)
    33 Yellow (желтый)
    34 Blue (синий)
    35 Magenta (пурпурный)
    36 Cyan (голубой)
    37 White (белый)

    Background Colours (цвет бумаги, или цвет фона):
    40 Black (черный)
    41 Red (красный)
    42 Green (зеленый)
    43 Yellow (желтый)
    44 Blue (синий)
    45 Magenta (пурпурный)
    46 Cyan (голубой)
    47 White (белый)

    Обратите внимание, если теперь вы скомандуете в терминале: echo \033[0;31mнекоторый текст\033[0m’

    … то предсказуемо получите на выходе монохромную абракадабру:



    Почему? Потому, что надо было задействовать расширенные возможности команды echo. Достаточно добавить один ключик: echo -e ‘\033[0;31mнекоторый текст\033[0m’

    Теперь вывод будет выглядеть правильно:



    С раскраской вывода на терминал разобрались. Теперь давайте посмотрим, как раскрасить приглашение командной строки.

    Это делается через изменение переменной PS1. Переменная отвечает за приглашение командной строки. Её внешний вид также можно изменять, в том числе при помощи escape-последовательностей. Но есть небольшое отличие: начинать последовательность нужно символом “\[”, а завершать символом “\]”, иначе она будет выведена на терминал.

    Все возможные командные последовательности подробно изложено в мануале по bash, так что я предлагаю читателям самостоятельно выбрать, что им больше нравится наблюдать в приглашении командной строки. В качестве примера приведу своё значение переменной PS1:

    \[\033[34;1m\]\t\[\033[0m\],\[\033[32m\]\u@\l@\h\[\033[0m\]:\[\033[33m\]\W\[\033[0m\],\[\033
    [31m\]\!\[\033[0m\]\$\n

    Расшифрую это страшное заклинание:

    \[\033[34;1m\] — включаем ярко-синий (второй атрибут) цвет шрифта
    \t – выводим текущее время в формате ЧЧ: ММ: СС
    \[\033[0m\] – сброс настроек цвета шрифта
    , — просто запятая (неожиданно, правда?)
    \[\033[32m\] — включаем зелёный цвет шрифта
    \u@\l@\h – выводим имя пользователя, номер терминального устройства и краткое имя хоста, разделяя символом “@”
    [\033[0m\] — снова сбрасываем настройки цвета шрифта
    : — просто двоеточие (внезапно!)
    \[\033[33m\] — включаем жёлтый цвет шрифта
    \W – выводим имя текущего каталога
    [\033[0m\] — опять сбрасываем настройки цвета шрифта
    , — ещё одна запятая (кто бы мог подумать!)
    \[\033[31m\] — включаем красный цвет шрифта
    \! — выводим номер команды в терминале
    [\033[0m\] — не забываем сбросить настройки цвета шрифта
    \$ — выводим “#” для root и “$” для всех остальных
    \n – перевод строки. Зачем? Чтобы команда начиналась с левого края окна, а не с позиции конца приглашения командной строки.

    Где переопределить переменную? Логичнее всего это сделать в ~/.bashrc.

    Внешний вид приглашения ограничен только вашей фантазией. В принципе, вам ничто не мешает с помощью вышеописанного инструментария сделать приглашение командной строки в виде новогодней ёлочки. Правда, такое приглашение будет очень громоздким, и удобнее работа точно не станет. Ёлочку можно просто выводить над приглашением командной строки при входе в систему (всё равно нам нужно редактировать ~/.bashrc). Дерзайте! И спасибо за внимание.



    Что ещё полезного можно почитать в блоге Cloud4Y

    Настраиваем top в GNU/Linux
    Пентестеры на передовой кибербезопасности
    Стартапы, способные удивить
    Нужны ли в ЦОД подушки?
    Дом, который построил робот

    Подписывайтесь на наш Telegram-канал, чтобы не пропустить очередную статью! Пишем не чаще двух раз в неделю и только по делу. Также напоминаем, что корпоративный облачный провайдер Cloud4Y запустил акцию «Облако ФЗ-152 по цене обычного». Подать заявку можно до 31 декабря.
    Cloud4Y
    #1 Корпоративный облачный провайдер

    Comments 12

      0

      Ну так-то, об этих раскрасках даже детсадовцы знают.


      PS а что означают красные цифры в конце строки приглашения?

        0
        Да, баловство. Признаю
        Красные цифры — это номер команды в истории.
        +4
        Ёлочка
        image

        С музычкой

          0
          Да, это смотрится!
          0

          Хорошая елочка, но не хватает мигающих гирлянд \e[5;31m*[0m и шаров \e[1;35mO[0m

            0
            Можно. Но будет раздражать :)
            0
            А как вместо тильды выводить текущий абсолютный путь?
              0
              \W
                0
                Добавить куда нужно
                $PWD
                или
                $(pwd)
                0
                Ну баловство же. Сразу теряется половина пространства.
                  0
                  Ну да, а как ещё можно развлекаться в предрождественский вечер?! Я вот вчера празднично выглядящее ASCII-представления хеша SSH-ключа раскрашивал. Правда, PuTTy в режиме эмуляции vt100 блинк игнорирует.
                  image
                    0
                    Вы считаете, что этого никто не знал? В интернете же полно статей про эти раскраки!
                    Даже в поиске куча выходит

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