Uwaga:
Oryginalna wersja tego artykułu została opublikowana w IBM developerWorks i
jest własnością Westtech Information Services. Poniższy dokument jest
poprawioną przez zespół GDP wersją oryginalnego tekstu i nie jest już
aktualizowany.
|
Prompt dla zaawansowanych
1.
Modyfikujemy znak zachęty
Każdy użytkownik systemu Linux/UNIX wiele czasu spędza pracując na konsoli,
widząc na swoim ekranie to:
Listing 1.1: Znak zachęty zwykłego użytkownika |
bash-2.04$
|
Jeśli przypadkiem jest zalogowany na koncie administratora, ma zaszczyt
oglądać inną wersję tego samego "pięknego" znaku zachęty:
Listing 1.2: Znak zachęty administratora |
bash-2.04#
|
Pokazane znaki zachęty nie są szczególnie interesujące. Nie dziwi więc, że
szereg dystrybucji Linuksa stosuje własne, dodając kolory i inne informacje.
Pomimo tego, nawet jeśli posiadasz taką nowoczesną dystrybucję, często znak
zachęty nie jest idealny. Możliwe jest zarówno dodanie jak i usunięcie kolorów,
czy informacji. Jego modyfikacja czy też stworzenie od zera, nie jest takie
trudne jak mogłoby się wydawać.
Podstawy
Korzystając z powłoki bash, do zmiany znaku zachęty doprowadzimy przez
modyfikację zmiennej środowiskowej PS1.
Listing 1.3: Modyfikacja zmiennej środowiskowej |
$ export PS1="> "
>
|
Zmiany zostaną natychmiast wprowadzone w życie, co można będzie łatwo zauważyć.
By zachować ustawienia znaku zachęty należy dodać definicję export w
pliku ~/.bashrc. PS1 może zawierać zwykły tekst:
Listing 1.4: Własny znak zachęty |
$ export PS1="To jest mój ultra fantastyczny znak zachęty > "
To jest mój ultra fantastyczny znak zachęty >
|
Można coś takiego uznać za interesujące, ale nie jest to szczególnie użyteczne,
gdy prompt zawiera dużo zwykłego tekstu. Większość stosowanych znaków zachęty
zawiera informacje takie jak nazwa użytkownika, aktualny katalog czy nazwę
hosta. Tego typu dane znacznie ułatwiają korzystanie z powłoki. Przykładowo,
następujący znak zachęty będzie zawierał nazwę użytkownika i hosta:
Listing 1.5: Bardziej użyteczny znak zachęty |
$ export PS1="\u@\H > "
drobbins@freebox >
|
Pokazany znak zachęty jest użyteczny dla ludzi, którzy pracują zdalnie używając
różnych kont, jako że pokazuje on zarówno gdzie oraz na jakim koncie się
znajdujemy.
W powyższym przykładzie, by uzyskać potrzebne informacje, używamy specjalnych
sekwencji, które przez bash są interpretowane jako pewne wartości, które są
używane gdy znajdują się w zmiennej PS1. Użyliśmy \u by pokazać
nazwę użytkownika oraz \H by uzyskać nazwę hosta. Poniżej znajduje się
kompletna lista rozpoznawanych przez bash sekwencji (znajduje się ona także na
stronie man basha, w sekcji "PROMPTING"):
| Sekwencja |
Opis |
| \a |
Znak dzwonka ASCII (można też użyć \007) |
| \d |
Data w formacie "DzieńTyg Miesiąc Dzień" |
| \e |
Znak ucieczki ASCII (można też użyć \033) |
| \h |
Nazwa hosta do pierwszej kropki (np. "mybox") |
| \H |
Nazwa hosta (np. "mybox.mydomain.com") |
| \j |
Liczba zawieszonych procesów w danej powłoce (używając ^Z) |
| \l |
Nazwa urządzenia terminala (np. "ttyp4") |
| \n |
Znak nowej linii |
| \r |
Powrót karetki |
| \s |
Nazwa pliku wykonywalnego powłoki (np. "bash") |
| \t |
Bieżący czas w formacie 24-godzinnym (np. "23:01:01") |
| \T |
Bieżący czas w formacie 12-godzinnym (np. "11:01:01") |
| \@ |
Bieżący czas w formacie 12-godzinnym z am/pm |
| \u |
Nazwa użytkownika |
| \v |
Wersja pliku wykonywalnego powłoki (np. 2.04) |
| \V |
Wersja pliku wykonywalnego powłoki, włączając wersję poprawki |
| \w |
Bieżący katalog roboczy (np. /home/drobbins) |
| \W |
Główna część nazwy bieżącego katalogu roboczego (np. "drobbins") |
| \! |
Numer polecenia w historii |
| \# |
Numer polecenia (będzie wzrastał w czasie używania powłoki) |
| \\$ |
Jeśli jesteś administratorem jest zastępowany znakiem #, w przeciwnym
przypadku używany jest symbol $. Jeśli ciąg w zmiennej jest
ograniczany przez apostrofy ('), a nie cudzysłowy ("), należy przed znakiem
$ wpisać tylko jeden slash zamiast dwóch.
|
| \xxx |
Znak ASCII odpowiadający liczbie szesnastkowej xxx (nieużywane cyfry należy
zastąpić zerami, np. \007)
|
| \\ |
Odwrotny ukośnik |
| \[ |
Początek sekwencji znaków niedrukowalnych (występujące po nim znaki nie
powodują zmiany położenia kursora, mogą to być np. ustawienia kolorów
terminala). Sekwencja ta umożliwia prawidłowe zawijanie wierszy.
|
| \] |
Koniec sekwencji znaków niedrukowalnych.
|
Są to wszystkie specjalne sekwencje interpretowane przez bash. Znając ich
działanie można teraz trochę własnoręcznie eksperymentować. Po tym głębszym
zapoznaniu się z mechanizmami rządzącymi znakiem zachęty czas na jej kolejne
urozmaicenie, dodamy kolory.
Kolory
Dodanie kolorów jest oczywiście bardzo proste; pierwszym krokiem jest
stworzenie odpowiadającego nam prompta bez użycie dodatkowych kolorów.
Następnie jedyne co musimy zrobić to dodać specjalne sekwencje sterujące
terminalem (nie powłoką bash), które dodadzą nieco barw znakowi zachęty.
Standardowy terminal systemowy oraz te graficzne umożliwiają zmianę koloru tła,
pierwszego planu (tekst), a także wagi czcionki (czy tekst jest pogrubiony, czy
nie). Do wyboru mamy osiem podstawowych kolorów, więc mamy z czego wybierać :).
Użycie danego koloru wiąże się z zastosowaniem specjalnej sekwencji sterującej w
zmiennej PS1 -- zasadniczo umieszczając odpowiednie liczby pomiędzy
\e[ (znak ucieczki) i m. Jeśli chcemy użyć większą ilość kodów,
używamy znaku średnika pomiędzy każdą z nich. Poniżej przykładowy kod koloru:
Listing 1.6: Dodanie koloru |
"\e[0m"
|
Zastosowanie powyższego kodu spowoduje powrót do wartości domyślnych ustawień
terminala, dotyczących koloru pierwszego planu, tła oraz wagi tekstu. Z tego
powodu jest on najczęściej stosowany na końcu znaku zachęty, aby tekst używany
w powłoce nie był kolorowy. Czas poznać kody umożliwiające na zastosowanie
wszystkich dostępnych w terminalu barw:
Ilustracja 1.1: Tabelka z kolorami |
 |
By otrzymać wymagany kod wpierw należy wybrać żądany kolor, następnie znaleźć
liczby odpowiadające pierwszemu planowi (30-37) i tłu (40-47). Przykładowo,
jeśli chcemy użyć zielonego koloru na czarnym tle, musimy użyć liczb 32 i 40.
Na koniec należy dodać znalezione kody do definicji znaku zachęty:
Listing 1.7: Podstawowy znak zachęty |
$ export PS1="\w> "
|
Teraz należy dodać interesujące nas kolory:
Listing 1.8: Kolorowy znak zachęty |
$ export PS1="\e[32;40m\w> "
|
Jak na razie całkiem nieźle, ale to jeszcze nie koniec. Po tym jak bash
zaprezentuje nam bieżący katalog roboczy, musimy jeszcze zmienić z powrotem
aktualny kolor na domyślny używając wspomnianej już sekwencji \e[0m:
Listing 1.9: Poprawiony, kolorowy znak zachęty |
$ export PS1="\e[32;40m\w> \e[0m"
|
Powyższy przykład zapewni nam przyjemny, zielony znak zachęty, ale ciągle
możemy go poddać drobnym, aczkolwiek wskazanym, modyfikacjom. Po pierwsze nie
musimy wskazywać użycia koloru tła, jako że kolor czarny, oznaczony przez
liczbę 40, jest jego wartością domyślną. Także sam kolor zielony jest trochę
ciemny, aby był jaśniejszy wystarczy dodać kod 1 dzięki czemu uzyskamy
tego co chcemy. Dodatkowo wszystkie niedrukowalne znaki powinniśmy otoczyć
specjalnymi sekwencjami \[ i \], co spowoduje, że bash będzie
poprawnie rozpoznawał ilość znaków występujących w promptcie i zapewni poprawne
zawijanie linii. Gdybyśmy ich nie dodali, otrzymamy oczywiście taki sam prompt,
ale gdy będziemy chcieli użyć komendy nie mieszczącej się w jednej linii
terminala zakończy się to bałaganem na ekranie, uniemożliwiającym sprawną pracę.
Oto finalny rezultat naszych modyfikacji:
Listing 1.10: Znak zachęty po modyfikacjach |
$ export PS1="\[\e[32;1m\]\w> \[\e[0m\]"
|
Oczywiście możemy dodać znacznie więcej kolorów by uatrakcyjnić jego wygląd:
Listing 1.11: Więcej kolorów |
$ export PS1="\[\e[36;1m\]\u@\[\e[32;1m\]\H> \[\e[0m\]"
|
Zabawa z xterm
Teraz każdy z nas może się pochwalić już całkiem pokaźną wiedzą dotyczącą znaku
zachęty, ale wciąż to jeszcze nie wszystko. Możemy zastosować kolejne specjalne
kody, dzięki którym pasek tytułowy terminala X (np. rxvt, aterm) będzie
dynamicznie odświeżany. By tego dokonać wystarczy dodać następującą sekwencję do
zmiennej PS1:
Listing 1.12: Zmiana paska tytułowego terminala |
"\e]2;pasek tytułowy\a"
|
Zmieniając ciąg pasek tytułowy możemy w prosty sposób modyfikować
zawartość paska tytułowego terminala. Oczywiście nie musimy używać statycznego
tekstu i możemy zastosować sekwencje specjalne omówione już wcześniej. W ten
sposób możemy więc uzyskać nazwę użytkownika, hosta czy też aktualny katalog
roboczy widoczny zarówno na pasku tytułowym jak i w samym znaku zachęty.
Listing 1.13: Niezwykle przydatny prompt |
$ export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
|
Powyższy znak zachęty został użyty na przedstawionym wcześniej zrzucie ekranu
zawierającym tabelę z dostępnymi w terminalu kolorami. Sam używam właśnie takiej
konfiguracji z tego względu, że cała potrzebna informacja zawarta jest w pasku
tytułowym, pozostawiając dla linii poleceń maksymalnie wiele miejsca. W tym
przypadku należy także pamiętać o dodaniu znaków \[ i \] dla
części odpowiedzialnej za generowanie informacji dla paska tytułowego, gdyż nie
są one drukowane w znaku zachęty, więc musimy o tym fakcie poinformować powłokę.
W powyższym przykładzie pozostaje jednak problem przypadku gdy nie używamy
terminala z poziomu uruchomionego serwera X. Wtedy informacja o aktualnym
położeniu może być pomocna, więc by była ona widoczna musimy oba te przypadki
odseparować. W tym celu można dodać do ~/.bashrc następujące
komendy:
Listing 1.14: Uniwersalny znak zachęty dla xterm i konsoli systemowej |
if [ "$TERM" = "linux" ]
then
export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
export PS1="\[\e]2;\u@\H \w\a\e[32;1m\]>\[\e[0m\] "
fi
|
Warunek dotyczący używanego znaku zachęty zapewni jego odpowiedni dobór w
zależności od typu terminala. Dodatkowo należy jeszcze poprawić zawartość
~/.bash_profile tak, by zawartość pliku ~/.bashrc była
używana przy starcie powłoki:
Listing 1.15: Edycja bash_profile |
source ~/.bashrc
|
Tym sposobem uzyskaliśmy niezwykle pomocny w codziennej pracy znak zachęty
niezależnie od tego czy uruchomimy powłokę systemową czy też jeden z
xterminali.
To już wszystkie sekrety związane z tworzeniem własnego znaku zachęty, uzyskana
w poradniku wiedza z pewnością pomoże w stworzeniu własnego, unikalnego prompta.
Materiały
-
rxvt jest doskonałym, małym xterminalem,
posiadającym rozbudowaną dokumentację opisującą sekwencje sterujące. Znajduje
się ona w katalogu doc tarballa zawierającego źródła programu.
-
aterm jest kolejnym xterminalem,
bazującym na rxvt. Charakteryzuje się wieloma ciekawymi możliwościami
wizualnymi m.in. przeźroczystość.
-
bashish
jest motywem tematycznym dla różnych typów terminali. Tutaj
można zobaczyć go w działaniu.
|