Znak zachęty w Linux

Po zalogowaniu się do systemu Linux pojawia się tzw znak zachęty. Jeśli myślałeś kiedyś jego zmianie to ten artykuł jest dla Ciebie 🙂

Znak zachęty (prompt) jest kontrolowany przez specjalną zmienną środowiskową PS1 (i dodatkowo PS2, PS3, PS4). Aby zmienić jego wygląd trzeba zmienić zawartość tej zmiennej. Na koniec powiem jak zrobić aby po zalogowaniu automatycznie nasz znak zachęty był wczytywany (na razie będzie działał do momentu wylogowania).

Aby edytować zmienną środowiskową musimy użyć polecenia export :
$ export PS1='Wartości'

Zamiast Wartości wpisujemy pewien ciąg znaków, który ma zostać wyświetlony. Powłoka Linuxa pozwala na to, by w miejsce Wartości wpisywać specjalne znaki, a mianowicie tzw. sekwencje ucieczek, które pozwalają, aby wyświetlany tekst prompt’a zmieniał się dynamicznie. Sekwencje ucieczek zostały opisane poniżej:

Sekwencja 
ucieczki	Opis
------------------------------------------
\a	Dzwonek (ang. Bell) - znak ASCII (07)
\d	Data w formacie: Dzień tygodnia Miesiąc Dzień (np. "Tue May 13")
\D{format}	Format jest przekazywany do strftime i zwrócony wynik wstawiany jest do prompt'a. Jeśli format był pusty, to rezultatem jest lokalna reprezentacja czasu. Nawiasy klamrowe są potrzebne.
\e	Znak ucieczki ASCII (033) - Ważny znak!
\h	Nazwa komputera (hostname) - do pierwszego znaku '.'
\H	Nazwa komputera (hostname)
\j	Liczba aktualnie zarządzanych operacji przez shell'a
\l	Podstawowa nazwa urządzenia terminalowego
\n	Znak nowej linii
\r	Powrót karetki (ang. carriage return)
\s	Nazwa shella, podstawowa nazwa $0
\t	Aktualny czas w formacie 24-godzinnym (HH:MM:SS)
\T	Aktualny czas w formacie 12-godzinnym (HH:MM:SS)
\@	Aktualny czas w formacie 12-godzinnym (am/pm)
\A	Aktualny czas w formacie 24-godzinnym (HH:MM)
\u	Nazwa aktualnego użytkownika
\v	Wersja basha (np. 2.00)
\V	Wydanie Basha, wersja + path level (np. 2.00.0)
\w	Ścieżka dostępu do bieżącego katalogu. Jeśli bieżącym katalogiem jest $HOME to nazwa skracana jest do tyldy (~)
\W	Nazwa bieżącego katalogu. Jeśli bieżacym katalogiem jest $HOME to nazwa skracana jest do tyldy (~)
\!	Numer (ilość, liczone względem historii) wykonanych poleceń
\#	Numer (ilość) wykonanych poleceń
\$	Jeśli efektywny UID jest 0 to znak: #, w przeciwnym wypadku znak: $
\nnn	Znak przedstawiony za pomocą liczby ósemkowej (np. 033)
\\	Backslash
\[	Rozpocznij sekwencję nie drukowalnych znaków, które używane są do kontrolowania wyświetlanych informacji prompt'a
\]	Zakończ sekwencję nie drukowalnych znaków

Stałymi ciągami znaków są nawiasy kwadratowe, które rozdzielają zmieniające się dynamicznie elementy prompta. Zamiast „Wartości” wpisujemy to co chcemy, by terminal wyświetlał.

Przykładowo aby utworzyć np poniższy znak zachęty

trzeba użyć polecenia

$ export PS1='[\A][\u@\h][\w] $ '

Sprawa lekko się komplikuje jeśli chcemy pokolorować prompt’a.

Aby rozpocząć kolorowanie musimy użyć specjalnego polecenia. Jako, że polecenie to jest ciągiem znaków, które nie będą wyświetlane na ekranie, to musimy skorzystać z sekwencji ucieczki, która otwiera sekwencję nie drukowalnych znaków. Po wprowadzeniu polecenia kolorowania, sekwencję znaków nie drukowalnych zamykamy! Następnie wpisujemy tekst, który ma zostać wydrukowany (w wybranym kolorze). Następnie otwieramy sekwencje dla nie drukowalnych znaków i wpisujemy polecenie kończące kolorowanie, oraz zamykamy sekwencję dla znaków nie drukowalnych.

Generalnie kolorowanie tekstu odbywa się w następującej formie:
\e[X;Ym TEKST_DO_KOLOROWANIA \e[m

Gdzie:

\e[ – Rozpoczyna kolorowanie
X;Y – para kolorów (wymienione w poniższej tabeli)
m – obowiązkowy znak
\e[m – Sekwencja znaków kończąca kolorowanie

Kolor		X;Y
-----------------------
Black		0;30
Blue		0;34
Green		0;32
Cyan		0;36
Red		0;31
Purple		0;35
Brown		0;33

Pierwszą wartość (X) można zamienić z 0 na 1 w celu uzyskania jaśniejszej wersji koloru.

Skoro mamy już właściwie wszystko co trzeba, to można spróbować pokolorować prompta. Zacznijmy najpierw od godziny.

Wartość ucieczki dla czasu jest \A czyli „Aktualny czas w formacie 24-godzinnym (HH:MM)”

export PS1='\[\e[0;32m\]\A\[\e[m\] $ '

Ponieważ mamy włączyć kolorowanie, a polecenie kolorowania nie jest ciągiem drukowalnych znaków to musimy przed jego użyciem użyć sekwencji otwierającej nie drukowalne znaki (pierwsze dwa czerwone znaki „\[„). Potem następuje włączenie kolorowania („\e[0;34m”). Kolejnymi znakami są \A, co odpowiada za godzinę w formacie 24-godzinnym. Aby ten i tylko ten tekst był w kolorze zielonym (X;Y = 0;32) musimy zamknąć kolorowanie (znaki „\e[m”).
Jeszcze musimy zamknąć sekwencję nie drukowalnych znaków (drugie dwa znaki „\]”). I na koniec wklejamy jeszcze znak $ oddzielający nasza godzinę od wykonywanych poleceń.
uruchamiamy polecenie i otrzymujemy prompta

Ponieważ każda z naszych części jest otoczona nawiasami kwadratowymi, to musimy je dodać, czyli polecenie powyższe po lekkiej modyfikacji wygląda następująco.

export PS1='[\[\e[0;32m\]\A\[\e[m\] ] $ '

i otrzymujemy godzinę w kwadratowych nawiasach

Analogicznie według tego samego schematu zrobione są kolejne części prompt’a. Całość prezentuje się następująco (spacje pomiędzy częściami zostały celowo wstawione, by pokazać, gdzie kończy się jedna część, a zaczyna druga).

export PS1='[\[\e[0;34m\] \A \[\e[m\]] [\[\e[0;32m\] \u \[\e[m\] @ \[\e[0;36m\] \h \[\e[m\]] [\[\e[0;35m\] \w \[\e[m\]] $ '

Teraz, spróbujemy bardziej skomplikowanego prompta

$ export PS1='[\[\e[0;34m\]\A\[\e[m\]][\[\e[0;32m\]\u\[\e[m\]@\[\e[0;36m\]\h\[\e[m\]][\[\e[0;35m\]\w\[\e[m\]] $ '

Ja osobiście preferuję poniższy prompt. Jakoś mi najbardziej przypadł do gustu 🙂

export PS1='[\[\e[0;37m\]\A\[\e[m\]][\[\e[0;32m\]\u\[\e[m\]@\[\e[0;33m\]\h\[\e[m\]][\[\e[0;36m\]\w\[\e[m\]] $ '

AUTOMATYCZNE ZAPISANIE PROMPTA

W momencie wyłączenia terminala i ponownym jego uruchomieniu, otrzymamy domyślne ustawienia prompt’a. Aby zachować te ustawienia i przy każdym włączeniu terminala ponownie go wyświetlić musimy zapisać go do pliku .bashrc, który znajduje się w katalogu domowym.

[23:03][root@localhost][~] $ ls -la

dr-xr-x---.  2 root root 4096 Mar 31  2017 .
dr-xr-xr-x. 17 root root 4096 Mar 27  2017 ..
-rw-------.  1 root root 1491 Mar 27  2017 anaconda-ks.cfg
-rw-------.  1 root root  548 Mar 31  2017 .bash_history
-rw-r--r--.  1 root root   18 Apr 30  2014 .bash_logout
-rw-r--r--.  1 root root  176 Apr 30  2014 .bash_profile
-rw-r--r--.  1 root root  176 Mar 31  2017 .bashrc
-rw-r--r--.  1 root root  100 Apr 30  2014 .cshrc
-rw-r--r--.  1 root root  129 Apr 30  2014 .tcshrc

Na wszelki wypadek wykonamy kopię pliku .bashrc a następnie uruchomimy edytora VI i wpiszemy nasz ciąg PS1.
$ cp ~/.bashrc ~/.bashrc2 && vi ~/.bashrc

Znajdź linie
if [ "$color_prompt" = yes ]; then
PS1='${debian_chroot:+($debian_chroot)}\[33[01;32m\]\u@\h\[33[00m\]:\[33[01;34m\]\w\[33[00m\]\$ '

i w miejsce PS1 wpisz definicję nowego prompt’a,
export PS1='[\[\e[0;37m\]\A\[\e[m\]][\[\e[0;32m\]\u\[\e[m\]@\[\e[0;33m\]\h\[\e[m\]][\[\e[0;36m\]\w\[\e[m\]] $ '

Jeśli nie ma powyższych wpisów po prostu należy wpisać PS1 do pliku.

Aby uzyskać jaśniejszy kolor czcionki, należy podczas definiowania koloru zamiast 0 wstawić 1 (np. zamiast koloru 0;32 wstawić 1;32).

Ten wpis został opublikowany w kategorii Linux i oznaczony tagami . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz