Gentoo Logo

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

Fig. 1

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
    # Pracujemy na konsoli systemowej lokalnie lub zdalnie
    export PS1="\[\e[32;1m\]\u@\H > \[\e[0m\]"
else
    # Nie używamy konsoli systemowej, przyjmujemy że jest to xterm
    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.


Drukuj

Zaktualizowano 21 października 2005

Podsumowanie: Dlaczego trzymać się domyślnego znaku zachęty jeśli z łatwością można go poprawić, poprzez dodanie kolorów czy dodatkowych informacji. W tym poradniku, Daniel Robbins pokazuje co należy zrobić, aby prompt spełniał nasze oczekiwania, również tutaj można znaleźć opis konfiguracji terminala tak by jego pasek tytułowy był automatycznie aktualizowany.

Daniel Robbins
Autor

Michał Kurgan
Tłumaczenie

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Online Kredit Index
Copyright 2001-2009 Gentoo Foundation, Inc. Questions, Comments? Contact us.