Разноцветные терминалы

Nov 30, 2015 17:07





развернуть



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

Для начала рассмотрим простой вариант, мой любимый формат командной строки.



PS1='\t j\j \u@\h:\w\n\$ '

Результат будет вот такой:

17:42:46 j0 olleg@petrel:~
$

Это обычное использование переменной PS1, но если бы я не начал с этого - рассказ был бы неполным. Обычно в переменной PS1 с помощью специальных последовательностей символов определяют формат приглашения для ввода команд. Подробный список этих последовательностей можно почитать в документации к bash, в данном примере:

  • \t - вывод «текущего времени», на самом деле это получается время завершения выполнения предыдущей команды, удобно когда перед глазами.
  • j\j - выводит символ j и после него количество запущенных job, т.е. процессов в фоне. Это тоже удобно иметь перед глазами чтобы случаем про них не забыть когда соберешься закрыть терминал.
  • \u@\h - имя пользователя и название сервера. Если работаете с несколькими серверами через удаленные терминалы - чтобы не путаться.
  • \w - после двоеточия - рабочая директория.
  • \n - поскольку строка получилась хоть и информативной (что-то вроде статус бара), но длинной, то приглашаем вводить команды с новой строки, а эта верхняя строка будет наглядно отделять от результата работы предыдущей команды.
  • \$ - на новой строке будет выводится символ либо $ для обычного пользователя либо # для root'а и отделив его пробелом можно приглашать вводить новую команду.


Казалось бы, чего еще желать… Но дальше будет интереснее. Дело в том, что с помощью специальных управляющих символов можно задавать цвет выводимого текста, цвет курсора и даже переопределять title bar у таких графических терминалов, как Gnome2. И, на мой взгляд, довольно удобно когда цветом отделяются терминалы запущенные на различных серверах. Для меня каждый сервер ассоциируется с каким-то цветом и в этот цвет мы будем красить командную строку и курсор на каждом сервере.

У меня .bashrc разделен на два файла, в самом .bashrc содержится общий код для всех серверов, а в .bash_local - уникальные для этого сервера настройки командной строки. .bash_local я буду вставлять в .bashrc специальной директивой. Начнем с .bash_local. В контексте данной статьи там у меня будут две строчки, которые определяют цвет этого сервера:

# .bash_local
# change cursor and prompt color
cursor_color='#0087FF'
prompt_color='33'

Просто заношу коды цвета в переменные. Но, как вы заметили, что способ задания цвета для курсора и для текста командной строки - разный. Почему-то так исторический получилось. Чтобы понять, какой цвет каким кодом кодируется, есть подходящая картинка.




Посредине - обозначение цвета для цвета курсора, снизу - обозначение цвета для текста. Как вы можете увидеть, что я для текста и курсора использую цвет морской волны. Т.к. название сервера petrel («буревестник»), то он ассоциируется у меня с этим цветом.

Теперь .bashrc, тоже показываю его не полностью, а только то что имеет отношение к теме:

# .bashrc
# local stuff
[[ -f ~/.bash_local ]] && . ~/.bash_local

Тут я вставляю код из .bash_local в общий файл. Таким образом определяться ранее описанные переменные с цветом сервера.

# set to red
root_cursor_color='#FF0000'
root_prompt_color='196'

Еще две переменные определяю с чисто красным цветом, он будет использоваться для маркировки терминалов привелигированного пользователя (root'а).

#my favorite PS1
case "$TERM" in
xterm*|rxvt*)
PS1='\[\e[38;5;'$prompt_color'm\]\t j\j \u@\h:\w\n'
[[ $UID == 0 ]] && { prompt_color=$root_prompt_color;cursor_color=$root_cursor_color; }
PS1="$PS1"'\[\e[m\e]12;'$cursor_color'\a\e[38;5;'$prompt_color'm\]\$ \[\e[m\]'
;;
*)
PS1='\t j\j \u@\h:\w\n\$ '
;;
esac

Тут проверяется какой используется терминал. Для любого неизвестного или неподдерживающего цвета будет использоваться приглашение без цвета (PS1='\t j\j \u@\h:\w\n\$ ') так, как я это описал в начале статьи. Но если имя терминала начинается на xterm или rxvt, например, так себя позиционирует терминал Gnome, начинаем кудесить с цветом. Первая строчка - задаем цвет текста - цвет сервера и выводим первую строку приглашения ввода команд. Она всегда будет окрашена в цвет сервера. Вторая строчка - проверяем, работаем ли мы под непривелигированным или привелигированным пользователем (root'ом). Если root - то переопределяем цвета на красный. Третья строчка - формируем вторую строчку приглашения и определяем цвет курсора в терминале. Т.е. там у нас получится либо $ и через пробел курсор, оба покрашенные в цвет сервера, если пользователь обычный. Либо красный # и через пробел красный курсор, если это root.

# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
;;
*)
;;
esac

А это, если честно, один в один скопированно из первоначального .bashrc от Дебиана. Знаю, что этот код видоизменяет title bar у окна, размещает там информацию об пользователе, сервере и домашней директории. Но поскольку этот код придумал не я, комментировать его не буду.

В результате у нас должно получится так, как на картинке в самом начале публикации.


Разноцветные терминалы
http://wiki.rosalab.com/ru/index.php/Цветная_консоль_(Bash)
Как "раскрасить" терминал в Ubuntu
http://pingvinus.ru/note/colorize-console-output
http://www.linux.org.ru/gallery/screenshots/5930877
Ёлочка в командной строке
Пользовательские настройки Bash

#0087ff, config, #my, bash, #ff0000, linux, консоль, полезное

Previous post Next post
Up