PS1 или приглашение в консоль [superserver@home] #

Привет Линуксойд, ты уже разобрался в линуксе и научился работать в консоли, быстро печатаешь команды, смотришь за тем, как черный экран с непонятной строкой внизу проглатывает их и отдает наружу лишь результат.

Всем известно приглашение для набора команд, типа
user@host $

В большинстве случаев пользователь Linux, забираясь в консоль, имеет дело с оболочкой bash, tcsh, sh, busybox, иной раз даже не задумываемся, с какой из оболочек имеем дело. А знаешь ли ты, что приглашение в консоли может быть намного удобнее и информативнее?

За содержание приглашения отвечает переменная среды PS1.

Узнать его содержание тебе поможет команда
echo $PS1


Пользователю позволено менять её содержимое, чем мы и воспользуемся. Мощность этого инструмента обеспечивают специальные символы, идущие после «\».
\a символ звонка таблицы ASCII (07)
\d дата в формате "день_недели месяц число"
\D format передаётся в функцию strftime(3), а результат подставляется. Пустой format приводит к отображению времени в текущей локали.
\e символ Escape таблицы ASCII (033)
\h имя машины до первой точки
\H полное имя машины
\j количество процессов, выполняемых в фоне оболочки
\l имя устройства терминала
\n перевод строки
\r возврат каретки
\s имя оболочки (базовое имя $0)
\t текущее время в формате HH:MM:SS 24 часов
\T текущее время в формате HH:MM:SS 12 часов
\@ текущее время в формате am/pm 12 часов
\A текущее время в формате HH:MM 24 часов
\u имя пользователя
\v версия bash
\V релиз bash - версия + патчи
\w текущий рабочий каталог (полный)
\W текущий рабочий каталог (сокращённый)
\! номер команды этой команды в истории
\# номер команды
\$ отображение # если суперпользователь, иначе $
\nnn восмеричный код символа
\\ обратный слэш
\[ начать последовательность непечатаемых символов
\] закончить последовательность непечатаемых символов

\! и \# различаются.



Особенности различия опущу.

Посмотрим, что нам предлагают разработчики различных дистрибутивов
Gentoo grifon@ghost /tmp/somefolder $
RedHat [grifon@ghost somefolder]$
Debian grifon@ghost:/tmp/somefolder$
OpenSUSE grifon@ghost:/tmp/somefolder>Для суперпользователя задают другие PS1, как правило, исключающие имя и меняющие конец на #.

Возму за основу gentoo (в простом виде это "\u@\h \w \$ ").
А теперь задумайся, часто ли ты работаешь с несколькими оболочками на одной машине под разными пользователями? Я, например, нет. Поэтому, имя его каждый раз выводить необязательно, достаточно различать себя и root.
То есть можно смело убирать \u@, получим

ghost /tmp/somefolder $

Далее, почему-то в gentoo думают, что я не буду работать на серверах с одинаковыми названиями машины, но разными сетями. А вот и буду, поэтому поменяю \h на \H, что даст мне возможность различать их по имени домена. Рабочий каталог пусть будет полный (понятно, где ты находишься, не прибегая к pwd) \w.
Если тебе надо видеть время, то лучше добавить его в начале строки. Засада в том, что время отображается то, когда выводилось приглашение на экран, а не когда запускалась команда. Так что это сомнительное удовольствие.
Более полезно видеть, сколько задач выполняется в текущей оболочке (ты ведь знаешь, что Linux - это многозадачная система и команды можно запускать в фоне, ставя в конце символ «&», или во время выполнения задачи нажать Ctrl-Z и потом bg номер_задачи?) поэтому добавляем последовательность [\j] перед \$
В итоге получаем следующий код:

\H \w [\j]\$


На экране:

ghost ~/Programs/disk [1]$


В общем, сразу понятно, где ты и зачем.
А теперь вспомни, что у тебя цветной монитор, а приглашение в командной строке уныло серое. Сейчас это, правда, редко встречается, спасибо, авторам дистрибутива. Но ведь раскрасить по-своему хочется? Ну что ж, тогда будем раскрашивать. Вот тут и пригодятся последовательности \[ и \].
Мы можем управлять атрибутами терминала через Escape-последовательности. Управление атрибутами отображения цвета текста осуществляется Esc [ параметры m. Символ Esc, как было упомянуто выше имеет код 033.
Возьми PS1 и оберни его так:

PS1='\[\033[01;31m\]\H \w [\j]\$\[\033[00m\] '


Получишь:

ghost ~/Programs/disk [0]$


Разберу последовательности.

Начало
\[ указывает, что будет нечто управляющее
\033[ говорит поменять атрибуты цвета (Esc [ ... m)
01 показывать ярко (выделенный текст)
; разделитель атрибутов
31 код красного цвета шрифта
\] говорит, что управляющий блок закончен

Далее весь текст выводится с установленными атрибутами
Чтобы вернуть атрибуты в их первоначальное состояние, в конце указывается \[\033[00m\].

Справка по атрибутам

0 сброс в первоначальное состояние
1 выделить
2 установить яркость наполовину
4 подчеркнуть
5 мигание
7 обратить цвета
21 установить нормальную интенсивность
24 выключить подчёркивание
25 выключить мигание
27 выключить обращение
30 установить чёрный цвет букв
31 установить красный цвет букв
32 установить зелёный цвет букв
33 установить коричневый цвет букв
34 установить синий цвет букв
35 установить пурпурный цвет букв
36 установить cyan цвет букв
37 установить белый цвет букв
40-47 тоже, что и 30-37, но для фона


Для себя я остановился на таком варианте:

\[\033[01;32m\]\H\[\033[01;34m\] \w \[\033[01;37m\][\j]\[\033[01;34m\]\$\[\033[00m\]


На экране:

ghost ~/Programs/disk [0]$

А для root покрасил юзера и # в красный цвет.
Сохранить свой труд можно в ~/.profile или ~/.bash_login

А для удобства команды установки цвета можно вытащить в переменные (и записать например в /etc/bash.bashrc) и ещё печатать время в приветствии. Этот вариант мне Автор предложил года 3 назад, когда я осваивать Linux начинал, и до сих пор пользуюсь именно таким приветствием.

RED="\e[0;31m"
GREEN="\e[0;32m"
ORANGE="\e[0;33m"
BLUE="\e[0;34m"
PURPLE="\e[0;35m"
CYAN="\e[0;36m"
GRAY="\e[0;37m"
WHITE="\e[0;38m"
NORM="\e[0;39m"


Варианты:

export PS1="[\[$\]\A\[$\]]\u@\h[\w]\$ "
[16:29]root@ns2[~]$

И для суперпользователя:

export PS1="\[$\][\A\[\]]\u@\h[\w]#$ "
[16:41]root@ns2[/home/root]#




Вас также может заинтересовать:

CMD.FM - Радио консоль в браузере
TODO для тех кто любит консоль
На базе Linux будет выпущена игровая консоль nD, стоимость которой составит 10-20 долларов