PS1 и как его едят

Grifon аватар

Итак, Уважаемый Линуксоид, ты уже разобрался с командной строкой, бодро отдаёшь команды и наблюдаешь за результатом. Но что-то в консоли тебя не устраивает, а что, ты и понять не можешь. Давай, я тебе помогу.

В большинстве случаев пользователь Linux, забираясь в консоль, имеет дело с оболочкой bash([1]). Вообще, история оболочек (shell на англ.) очень длинна, но все они имеют общее сходство - командная строка, при этом, мы даже, как правило, не задумываемся, с каким интерпретатором имеем дело. То ли это bash, то ли sh, то ли вообще busybox.
Всем известно приглашение для набора команд, типа

user@host $

А знаешь ли ты, что это приглашение может быть намного удобнее и информативнее?
Давай с этим разберёмся. За его содержание отвечает переменная среды PS1.
Если ты ещё не знаешь, что такое переменная среды, объясню: как и во всякой програма, оболочка содержит ряд пар имя=значение, которые могут быть установленны, изменены или удалены. Установка происходит присвоением:

a=b

Изменение может происходить аналогично, либо модификацией, например:

a=1
((a++))

Удаление командой unset:

unset a

Сегодня мы поговорим об одной переменной - PS1. PS1 отвечает за вид приглашения, которое ты видишь перед курсором.
Узнать его содержание тебе поможет команда

echo $PS1

Пользователю позволено менять её содержимое, чем мы и воспользуемся. Мощность этого инструмента обеспечивают специальные символы, идущие после «\».

\aсимвол звонка таблицы ASCII (07)
\dдата в формате "день_недели месяц число"
\D{format}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восмеричный код символа
\\обратный слэш
\[начать последовательность непечатаемых символов
\]закончить последовательность непечатаемых символов

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

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

Gentoogrifon@ghost /tmp/somefolder $
RedHat[grifon@ghost somefolder]$
Debiangrifon@ghost:/tmp/somefolder$
OpenSUSEgrifon@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\].
Справка по атрибутам (полностью описаны в [2]):

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
Для справок:

  1. bash(1)
  2. console_codes(4)

Gim аватар

А для удобства команды установки цвета можно вытащить в переменные (и записать например в /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="[\[${GREEN}\]\A\[${NORM}\]]\u@\h[\w]\$ "
[16:29]raydan@t46x[~]$

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

export PS1="\[${RED}\][\A\[\]]\u@\h[\w]#${NORM} "
[16:41]root@t46x[/home/raydan]#

Grifon аватар

Цитата:
Если тебе надо видеть время, то лучше добавить его в начале строки. Засада в том, что время отображается то, когда выводилось приглашение на экран, а не когда запускалась команда. Так что это сомнительное удовольствие.

Определение цветов - хорошая идея. Кто ещё своё оформление предложит?

sdfgh153 аватар

Пользуетесь гадостью всякой, потомки Борна отвратительны все без исключения после rc из Plan9, но раз уж такая пьянка пошла — zsh вполне съедобный.

Gim аватар

Раз уж такая пьянка - расскажешь может, что такого крутого в плановской оболочке? Про zsh думаю все так знают и кому баша не хватает пользуются, а вот план лично я ещё не покурить не успел.

sdfgh153 аватар

RC плановский это заново написанный шелл для заново написанного UNIX. С учетом ошибок предыдущих лет.
Он может показаться неудобным сначала (в нем нет автокомплита из коробки, например), но у него отлчные скриптовые возможности и понятный синтаксис.
Да и в использовании каждодневном он приятен.

Grifon аватар

Отлично, вот и напиши об этом, чтобы было понятно и захотелось попробовать

sdfgh153 аватар

Что, еще раз?
Что у линуксоидов за привычка — сущности плодить (:

Grifon аватар

Тогда бы ссылочки сразу в подкрепление к своему мнению прикрепил, а не ждал, когда попросят

sdfgh153 аватар

То есть как «ламеров» на форумах в гугль — дак линуксоиды первые, а как самим что надо, то лучше со ссылками.
Хехе.

MT аватар

Не сравнивай тёплое с мягким. Никому от тебя ничего не надо. Если что-то утверждаешь — подтверди это ссылками. Иначе получится не дискуссия, а тупой холивар.

sdfgh153 аватар

>Никому от тебя ничего не надо.
Oh really? То-то я смотрю самая длинная ветка в обсуждении.
У вас от серьезности зеркала не трескаются? (-:

Grifon аватар

Представь на минуту, что гуглить тут всë-таки умеют, но раз ты сказал, что тебе по душе какой-то более продвинутый вариант, подкрепил бы слова ссылкой на тот материал, который бы мог помочь понять твою точку зрения. Это совсем не сложно, уменьшает степень голословности, и не содержит пережёвывания.

sdfgh153 аватар

Ты не подумай, что я замыслил плохое, но:
> подкрепил бы слова ссылкой на тот материал, который бы мог помочь понять твою точку зрения
это когда я научные статьи пишу так делаю, а когда я общаюсь с людьми, которые умеют гуглить (я в этом не сомневаюсь) мне кажется это странным.
Если ты читаешь текст и встречаешь слово «амбидекстр», ты начинаешь писать емейл автору или все-таки лезешь в википедию? Это уже на уровне спиномозговых рефлексов у людей, которые умеют гуглить. Поэтому я не особо понял претензии к отсутсвию ссылок.

Grifon аватар

Странно, что, имея опыт написания научных статей, ты не понял такую простую вещь, как наличие аргументации в собственных словах.

sdfgh153 аватар

Странно, что имея тяжелую артилерию люди до сих пор дерутся на кулаках (:

Grifon аватар

Я так понял, мы не достойны того, чтобы для нас ты подркеплял слова аргументами? Ну тогда извини, что я позволил себе отвлечь твой интеллект на столь непристойные темы.

sdfgh153 аватар

Давай сейчас еще обидимся, ололо.

Неужели не очевидно, что метафора с артилерией не про людей, а про идеи и высказывания?
Если я пишу: «Исходя из анализа парадокса Жирара проведенного Терри Кокандом очевидно противоречивое положение изоморфизма Карри-Ховарда» — ссылки тут в тему. Потому что я сам гуглил анализ этого злоебучего парадокса три часа, а про изоморфизм вообще год назад не знал.
Тебе в голову не приходила простая мысль: не все слова нужно подкреплять аргументами? Ну вот просто не нужно и все тут, потому что они либо очевидны (что не так в данном случае, тут вообще было субъективное мнение), либо очень легко проверяются или выясняются самостоятельно. И даже как-то стыдно, что ли, просить ссылку на статью про Plan 9 RC, но, я повторюсь, раз тут такие правила — я постараюсь впредь давать вам ссылки на все, что только пожелаете.
Не обижайся, я правда не собирался никого обижать.

Grifon аватар

Во-первых, это не обида. Во-вторых, давай разберёмся с объектами обсуждения. Допустим, в нашей речи, есть объект, о котором мы ведём речь. Вполне допустимо, что у него будут как сторонники, так и противники. Допустим, ты выступаешь в его поддержку. Тогда статьи, найденные оппонентом в поисковых службах, содержащие негативную окраску, будут вступать в противоречие с твоим словом. Поэтому тебе лучше сразу указать на те ссылки, которые подтверждают твои слова, а уж минусы оппонент при желании найдёт сам. Так понятнее, почему я прошу дать ссылку, или нет?

sdfgh153 аватар

Манная каша вкусна.

Посмотри, что ты наделал (:
>Тогда статьи, найденные оппонентом в поисковых службах, содержащие негативную окраску, будут вступать в противоречие с твоим словом
А это не нормально разве? По-моему это называется «дисскуссия». Если я каждое свое утверждение приправленное изрядной долей иронии буду сопровождать ссылками, все умрут. Но мысль твою я понял.

Grifon аватар

если мы будем вести речь о манной каше, то да, так и надо. и всё-таки, здравый смысл должен преобладать над абсурдом, будь ты хоть трижды ироничен.

Gim аватар

Я вот как вижу - у тебя негатив есть по отношению к пользователям Linux по какой-то причине, ты пришёл с этим негативом (он явно виден в этом посте), и в остальных постах явно заметен. Придираешься к словам, на просто просьбу привести ссылки огрызаешься, из твоих постов прямо прёт насколько ты крут и если быть честным ты весьма вписываешься в сложившийся у некоторых (не безосновательно) негативный образ линуксоида, который ты сам критикуешь. Если же весь этот негатив тебе приятен или даже был целью - то "у меня для тебя плохие новости" :)

Видишь - когда я например говорю "где-то я слышал, что rc - клёвая оболочка", то с меня никто ссылок явно спрашивать не будет. Если я говорю "rc - мега клёвая штука", как бы подразумевается что я ей пользовался, знаю что говорю и в этом случае хорошим тоном (по крайней мере здесь) считается сразу приводить ссылки на статьи, прочитав которые люди смогут понять, чем rc хороша. И под хорошим тоном я здесь понимаю не глупую традицию, а уважение к времени других. Знаешь что-то новое, интересное, разбираешься и заявляешь об этом - поделись с другими. Как бы в этом одна из фишек Linux и свободного ПО, а не в том, чтобы посылать нубов в гугл или ещё подальше.

sdfgh153 аватар

>Я вот как вижу - у тебя негатив есть по отношению к пользователям Linux по какой-то причине, ты пришёл с этим негативом (он явно виден в этом посте), и в остальных постах явно заметен. Придираешься к словам, на просто просьбу привести ссылки огрызаешься, из твоих постов прямо прёт насколько ты крут и если быть честным ты весьма вписываешься в сложившийся у некоторых (не безосновательно) негативный образ линуксоида, который ты сам критикуешь.

А все потому, что в html до сих пор нет тэга «irony», а без смайликов, почему-то, никто не понимает, что происходит.
Нет у меня никакого негатива к «пользователям Linux», более того, я сам минимум в трех местах пользователь линукс и ничего, рожа не похудела, глаза не покраснели (:
Просто тяжело удержаться и не начать подтрунивать над людьми у которых настолько серьезные лица в столь неподобающей ситуации, простите (:

Вы меня хоть убейте, но я не понимаю смысл уважения к времени других, я ведь других совсем не заставляю: а) читать то, что я написал, б) тем более реагировать на это. Особенно смешно этот призыв выглядит на ресурсе «Whatever Users Group», который в первую очередь несет социально-развлекательную функцию (или тут ты тоже спорить будешь?).
Но раз уж тут такая «традиция», то наздоровье, я учту на будущее (:

MT аватар

Пацаны, расслабьтесь. Don't Feed the Trolls.

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".