Итак, Уважаемый Линуксоид, ты уже разобрался с командной строкой, бодро отдаёшь команды и наблюдаешь за результатом. Но что-то в консоли тебя не устраивает, а что, ты и понять не можешь. Давай, я тебе помогу.
В большинстве случаев пользователь 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 | восмеричный код символа |
| \\ | обратный слэш |
| \[ | начать последовательность непечатаемых символов |
| \] | закончить последовательность непечатаемых символов |
\! и
\# различаются. Особенности различия опущу.
Посмотрим, что нам предлагают разработчики различных дистрибутивов
| 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\].
Справка по атрибутам (полностью описаны в
[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
Для справок:
- bash(1)
- console_codes(4)
А для удобства команды установки цвета можно вытащить в переменные (и записать например в
/etc/bash.bashrc) и ещё печатать время в приветствии. Этот вариант мне Аврор предложил года 3 назад, когда я осваивать Linux начинал, и до сих пор пользуюсь именно таким приветствием.Приветствие для пользователя у меня:
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]#Определение цветов - хорошая идея. Кто ещё своё оформление предложит?
Пользуетесь гадостью всякой, потомки Борна отвратительны все без исключения после rc из Plan9, но раз уж такая пьянка пошла — zsh вполне съедобный.
Раз уж такая пьянка - расскажешь может, что такого крутого в плановской оболочке? Про zsh думаю все так знают и кому баша не хватает пользуются, а вот план лично я ещё не покурить не успел.
RC плановский это заново написанный шелл для заново написанного UNIX. С учетом ошибок предыдущих лет.
Он может показаться неудобным сначала (в нем нет автокомплита из коробки, например), но у него отлчные скриптовые возможности и понятный синтаксис.
Да и в использовании каждодневном он приятен.
Отлично, вот и напиши об этом, чтобы было понятно и захотелось попробовать
Что, еще раз?
Что у линуксоидов за привычка — сущности плодить (:
Тогда бы ссылочки сразу в подкрепление к своему мнению прикрепил, а не ждал, когда попросят
То есть как «ламеров» на форумах в гугль — дак линуксоиды первые, а как самим что надо, то лучше со ссылками.
Хехе.
Не сравнивай тёплое с мягким. Никому от тебя ничего не надо. Если что-то утверждаешь — подтверди это ссылками. Иначе получится не дискуссия, а тупой холивар.
>Никому от тебя ничего не надо.
Oh really? То-то я смотрю самая длинная ветка в обсуждении.
У вас от серьезности зеркала не трескаются? (-:
Представь на минуту, что гуглить тут всë-таки умеют, но раз ты сказал, что тебе по душе какой-то более продвинутый вариант, подкрепил бы слова ссылкой на тот материал, который бы мог помочь понять твою точку зрения. Это совсем не сложно, уменьшает степень голословности, и не содержит пережёвывания.
Ты не подумай, что я замыслил плохое, но:
> подкрепил бы слова ссылкой на тот материал, который бы мог помочь понять твою точку зрения
это когда я научные статьи пишу так делаю, а когда я общаюсь с людьми, которые умеют гуглить (я в этом не сомневаюсь) мне кажется это странным.
Если ты читаешь текст и встречаешь слово «амбидекстр», ты начинаешь писать емейл автору или все-таки лезешь в википедию? Это уже на уровне спиномозговых рефлексов у людей, которые умеют гуглить. Поэтому я не особо понял претензии к отсутсвию ссылок.
Странно, что, имея опыт написания научных статей, ты не понял такую простую вещь, как наличие аргументации в собственных словах.
Странно, что имея тяжелую артилерию люди до сих пор дерутся на кулаках (:
Я так понял, мы не достойны того, чтобы для нас ты подркеплял слова аргументами? Ну тогда извини, что я позволил себе отвлечь твой интеллект на столь непристойные темы.
Давай сейчас еще обидимся, ололо.
Неужели не очевидно, что метафора с артилерией не про людей, а про идеи и высказывания?
Если я пишу: «Исходя из анализа парадокса Жирара проведенного Терри Кокандом очевидно противоречивое положение изоморфизма Карри-Ховарда» — ссылки тут в тему. Потому что я сам гуглил анализ этого злоебучего парадокса три часа, а про изоморфизм вообще год назад не знал.
Тебе в голову не приходила простая мысль: не все слова нужно подкреплять аргументами? Ну вот просто не нужно и все тут, потому что они либо очевидны (что не так в данном случае, тут вообще было субъективное мнение), либо очень легко проверяются или выясняются самостоятельно. И даже как-то стыдно, что ли, просить ссылку на статью про Plan 9 RC, но, я повторюсь, раз тут такие правила — я постараюсь впредь давать вам ссылки на все, что только пожелаете.
Не обижайся, я правда не собирался никого обижать.
Во-первых, это не обида. Во-вторых, давай разберёмся с объектами обсуждения. Допустим, в нашей речи, есть объект, о котором мы ведём речь. Вполне допустимо, что у него будут как сторонники, так и противники. Допустим, ты выступаешь в его поддержку. Тогда статьи, найденные оппонентом в поисковых службах, содержащие негативную окраску, будут вступать в противоречие с твоим словом. Поэтому тебе лучше сразу указать на те ссылки, которые подтверждают твои слова, а уж минусы оппонент при желании найдёт сам. Так понятнее, почему я прошу дать ссылку, или нет?
Манная каша вкусна.
Посмотри, что ты наделал (:
>Тогда статьи, найденные оппонентом в поисковых службах, содержащие негативную окраску, будут вступать в противоречие с твоим словом
А это не нормально разве? По-моему это называется «дисскуссия». Если я каждое свое утверждение приправленное изрядной долей иронии буду сопровождать ссылками, все умрут. Но мысль твою я понял.
если мы будем вести речь о манной каше, то да, так и надо. и всё-таки, здравый смысл должен преобладать над абсурдом, будь ты хоть трижды ироничен.
Я вот как вижу - у тебя негатив есть по отношению к пользователям Linux по какой-то причине, ты пришёл с этим негативом (он явно виден в этом посте), и в остальных постах явно заметен. Придираешься к словам, на просто просьбу привести ссылки огрызаешься, из твоих постов прямо прёт насколько ты крут и если быть честным ты весьма вписываешься в сложившийся у некоторых (не безосновательно) негативный образ линуксоида, который ты сам критикуешь. Если же весь этот негатив тебе приятен или даже был целью - то "у меня для тебя плохие новости" :)
Видишь - когда я например говорю "где-то я слышал, что rc - клёвая оболочка", то с меня никто ссылок явно спрашивать не будет. Если я говорю "rc - мега клёвая штука", как бы подразумевается что я ей пользовался, знаю что говорю и в этом случае хорошим тоном (по крайней мере здесь) считается сразу приводить ссылки на статьи, прочитав которые люди смогут понять, чем rc хороша. И под хорошим тоном я здесь понимаю не глупую традицию, а уважение к времени других. Знаешь что-то новое, интересное, разбираешься и заявляешь об этом - поделись с другими. Как бы в этом одна из фишек Linux и свободного ПО, а не в том, чтобы посылать нубов в гугл или ещё подальше.
>Я вот как вижу - у тебя негатив есть по отношению к пользователям Linux по какой-то причине, ты пришёл с этим негативом (он явно виден в этом посте), и в остальных постах явно заметен. Придираешься к словам, на просто просьбу привести ссылки огрызаешься, из твоих постов прямо прёт насколько ты крут и если быть честным ты весьма вписываешься в сложившийся у некоторых (не безосновательно) негативный образ линуксоида, который ты сам критикуешь.
А все потому, что в html до сих пор нет тэга «irony», а без смайликов, почему-то, никто не понимает, что происходит.
Нет у меня никакого негатива к «пользователям Linux», более того, я сам минимум в трех местах пользователь линукс и ничего, рожа не похудела, глаза не покраснели (:
Просто тяжело удержаться и не начать подтрунивать над людьми у которых настолько серьезные лица в столь неподобающей ситуации, простите (:
Вы меня хоть убейте, но я не понимаю смысл уважения к времени других, я ведь других совсем не заставляю: а) читать то, что я написал, б) тем более реагировать на это. Особенно смешно этот призыв выглядит на ресурсе «Whatever Users Group», который в первую очередь несет социально-развлекательную функцию (или тут ты тоже спорить будешь?).
Но раз уж тут такая «традиция», то наздоровье, я учту на будущее (:
Пацаны, расслабьтесь. Don't Feed the Trolls.