трохи поекспериментував з кастомізацією запрошення в командній оболонці (bash prompt): додавав смайлики і навіть котиків, фарбував різні частини в усі кольори веселки тощо…

награвся і повернувся до стандартного, — не зовсім, але майже:
  • додав номер команди в історії;
  • додав кольорове кодування запрошення для root'а;
  • додав кольорове кодування залежно від коду завершення попередньої команди;
  • додав індикатор кількості фонових процесів.
результат на знятку. в .bashrc таке:

export PS1='\[\e[2;37m\]\! \[\e[1;32m\]\u@\H\[\e[0m\] \w $(if [[ $? != 0 ]]; then echo "\[\e[31m\]"; fi)$([ \j -gt 0 ] && echo "\[\e[2;37m\][\j]\[\e[0m\] ")\$\[\e[0m\] '

виглядає трохи складно. але якщо врахувати, що всі фрагменти «\[\e[2;37m\]» — то лише кодування кольорів тексту, залишається основа, яка теж працюватиме:

export PS1='\! \u@\H \w $(if [[ $? != 0 ]]; then echo "(Error)"; fi)$([ \j -gt 0 ] && echo "[\j] ")\$ '

її нескладно розібрати на елементи:
  • \! — номер команди в історії (див. history);
  • \u — ім'я користувача;
  • \H — ім'я машини (повністю);
  • \w — поточна директорія (повністю);
  • $(if [[ $? != 0 ]]; then echo "(Error)"; fi) — перевірка коду завершення ($?) попередньої команди;
  • $([ \j -gt 0 ] && echo "[\j] ") — перевірка (так, в bash можна без if), чи є фонові процеси (\j);
  • \$ — запрошення ($, або ж # для root'а)
налаштував і тішуся.

деякі питання й відповіді:

де перевірка root  чи не root?
немає. root використовує свій .bashrc, тому йдемо в його профіль (su root) і прописуємо все те саме йому в PS1, лише міняємо колір частини \u@\H (або лише \u, кому як більше до вподоби).

навіщо номери команд?
для зручності: !! в баш перезапускає останню команду, !<номер> ще раз запускає команду з певним номером, history 10 покаже десять останніх команд з номерами.

звісно, найпростіше тиснути стрілки вгору (ctrl+p) та вниз (ctrl+n), якщо потрібно знайти щось дуже неглибоко в історії — гадаю, більшість початківців так і роблять (особливо ті, хто в термінал зазирає лише раз на рік, коли щось поламається).

стоп! а де котики?!
простенький варіант з котиком, котрий посміхається або хмуриться залежно від результату виконання попередньої команди:

PS1='$(if [[ $? == 0 ]]; then echo "\[\e[32m\]😺"; else echo "\[\e[31m\]🙀"; fi)\[\e[0m\] \u@\H \w $ '

проблема в тому, що символ котика в деяких шрифтах може мати нестандартну ширину, це трохи збиває bash з пантелику.

що з цим робити?!
це стосується лише linux та командної оболонки bash. відкрити текстовим редактором (nano, micro, geany, gedit тощо) файл .bashrc:

nano ~/.bashrc

та додати останнім рядком:

export PS1='\[\e[2;37m\]\! \[\e[1;32m\]\u@\H\[\e[0m\] \w $(if [[ $? != 0 ]]; then echo "\[\e[31m\]"; fi)$([ \j -gt 0 ] && echo "\[\e[2;37m\][\j]\[\e[0m\] ")\$\[\e[0m\] '

після цього перезавантажити .bashrc:

source ~/.bashrc

все, має працювати, і навіть після перезавантаження.

я поліз в .bashrc і поламав своє запрошення!
просто в терміналі, не зважаючи на кракозябли, друкуємо (див. вище пояснення елементів):

export PS1='\u@\H:\w\$ '

і маємо мінімалістичний промпт — тоді гуглимо і навчаємося робити аварійні копії важливих файлів перед редагуванням =)

ти що, збоченець? хто у 21 столітті користується цими командами?
так. велика, величезна кількість збоченців користується.

    8 коментар(ів):

    piktor сказав...

    Велике прохання надалі замальовувати модель ноутбука.

    івась тарасик сказав...

    @piktor …і роздільність? гаразд, врахую =D

    Yarema сказав...
    Автор видалив цей коментар.
    Yarema сказав...

    А потрафиш написати запрошення, яке б показувало поточну теку, а коли цей шлях великий, то би скорочувала його якось до певної кількості символів?
    Можна перевірку на рута використовувати, щось типу
    if [ `id -u` != "0" ]; then PS1=....
    або
    if [ `whoami` != "root" ]; then PS1=....

    івась тарасик сказав...

    @yarema легко (сподіваюся, blogger нічого не поріже, бо в коментарях тег code заборонено):

    PS1='\[\e[2;37m\]\! \[\e[1;32m\]\u@\H\[\e[0m\] $(if [[ ${#PWD} -gt 20 ]]; then echo "${PWD:1:9}..${PWD:(-9)}"; else echo "${PWD}"; fi) $(if [[ $? != 0 ]]; then echo "\[\e[31m\]"; fi)$([ \j -gt 0 ] && echo "\[\e[2;37m\][\j]\[\e[0m\] ")\$\[\e[0m\] '

    ключова частина:

    $(if [[ ${#PWD} -gt 20 ]]; then echo "${PWD:1:9}..${PWD:(-9)}"; else echo "${PWD}"; fi)

    зроблено нашвидкоруч, тож я не заморочувався заміною /home/ на ~, і ще довжину налаштовувати треба руцями: я зробив макс. 20 (і тоді довгий шлях розбивається на 9..9).

    про перевірку на root я знаю, але воно не працює — найперше я саме так і пробував: після su root все-одно читається інший .bashrc, а не користувацький.

    івась тарасик сказав...

    @yarema перепрошую, невеличка «неуважна» помилочка: замість ${PWD:1:9} має бути ${PWD:0:9}. повністю:

    PS1='\[\e[2;37m\]\! \[\e[1;32m\]\u@\H\[\e[0m\] $(if [[ ${#PWD} -gt 20 ]]; then echo "${PWD:0:9}..${PWD:(-9)}"; else echo "${PWD}"; fi) $(if [[ $? != 0 ]]; then echo "\[\e[31m\]"; fi)$([ \j -gt 0 ] && echo "\[\e[2;37m\][\j]\[\e[0m\] ")\$\[\e[0m\] '

    івась тарасик сказав...

    @yarema хаха, зараз @piktor сміятиметься, але… той випадок, коли керування регістром в css коментарів «фідфутболило» мені: імена зарезервованих змінних мають бути у верхньому регістрі. зараз зроблю окремим дописом =)

    івась тарасик сказав...

    @yarema http://pastebin.com/1ecvwKzk

    Дописати коментар

    увага!
    коментарі не модерую, проте спам видаляю нещадно. посилання на інші сайти/блоги за темою допису вітаю.

    додаткові можливості розмітки (кутики набрати з клавіатури):
      ‹b›жирний шрифт‹/b›
      ‹i›похилий шрифт‹/i›
      ‹a href="http://tivasyk.info"›посилання‹/a›