покращене просте запрошення в терміналі

| комп'ютери, linux, підказки, bash

трохи поекспериментував з кастомізацією запрошення в командній оболонці (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 столітті користується цими командами?
так. велика, величезна кількість збоченців користується.