Kolorowa linia poleceń w Bashu

Po tym jak ostatnio musiałem naprawiać linię poleceń pewnej wielce poważanej serwerowej dystrybucji postawiłem opisać, jak się to robi prawidłowo. Bo z przerażeniem odkryłem, że większość dostępnych opisów zawiera błędy.

Ale zacznijmy od początku. Linia poleceń o której mówię, zwykle wygląda tak:

Wiele osób mówi, jak można zdefiniować kolory. Jednak w większości przypadków taka zabawa kończy się mniej więcej tak:

Jak więc prawidłowo zdefiniować linię poleceń?

W pliku ~/.bashrc definiujemy zmienną

export PS1='tutaj nasza definicja'

Styl definiujemy pomiędzy \[\033[ a m\].

Kody kolorów czcionki (dla koloru tła dodaj 10 do tej liczby):

  • 30 – czarny
  • 31 – czerwony
  • 32 – zielony
  • 33 – brązowy
  • 34 – niebieski
  • 35 – fioletowy
  • 36 – jasnoniebieski
  • 37 – biały
  • 0 – usuń wszelkie formatowanie

Efekty czcionki:

  • 0 – czcionka normalna
  • 1 – pogrubienie
  • 4 – podkreślenie
  • 5 – mruganie
  • 7 – zamień kolory czcionki i tła

Jeśli chcemy połączyć razem kilka efektów, to rozdzielamy poszczególne kody średnikami. Na przykład pogrubiona fioletowa czcionka na białym tle to 1;35;47. Jeśli chcemy wyczyścić całe formatowanie, to wystarczy wpisać 0 (czyli zero).

Większość opisów w sieci zawiera zwykle takie błędy:

  • brak domknięcia definicji \]
  • \e to nie jest idealnie to samo co \[\033

W praktyce ja stosuję takie definicje:

# user
export PS1='\[\033[32m\]\u\[\033[33m\]@\[\033[1;36m\]\h\[\033[0;33m\]:\[\033[31m\]\w \[\033[1;32m\]\$\[\033[0m\] '

# root
export PS1='\[\033[41;1;32m\]\u\[\033[0;33m\]@\[\033[1;36m\]\h\[\033[0;33m\]:\[\033[31m\]\w \[\033[1;31m\]\$\[\033[0m\] '

Pogrubiony host przydaje się zwłaszcza gdy loguję się na wiele serwerów. Łatwo wtedy napsuć wpisując komendę nie w tym oknie, w którym się chce. A gdy jestem rootem dodatkowo podkreślam kolorem, by było to widać z daleka.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.