8.3 BASH - The Bourne Again Shell

8.3.1 Zmienne środowiskowe

LinuX to złożona bestia. Trzeba w nim zwracać uwagę na wiele rzeczy, cała masa detali wpływa na codzienną pracę twojego systemu oraz interakcję z programami (o wielu z tych detali być może nie wiesz, że istnieją). Nikt nie chce przekazywać masy opcji do każdego uruchamianego programu, mówić jakiego terminala się używa, jaka jest nazwa komputera, jak powinien wyglądać znak zachęty...

Dla ułatwienia życia użytkownicy otrzymują przydatne coś, zwane środowiskiem. Środowisko definiuje warunki, w których uruchamiają się programy; niektóre z tych warunków są zmiennymi, które może definiować wedle własnych potrzeb użytkownik (jest to prawidłowość właściwa tylko Linuksom). Praktycznie każda powłoka ma swoje własne zmienne środowiskowe (jeżeli nie ma - to najpewniej jest to powłoka niezbyt przydatna). Przyjrzymy się teraz pewnym poleceniom, które bash udostępnia do manipulowania swoimi zmiennymi środowiskowymi.

Polecenie set wpisane bez żadnych parametrów wypisze wszystkie aktualnie zdefiniowane zmienne środowiskowe, wraz z przyporządkowanymi im wartościami. Tak jak większość poleceń wbudowanych (ang. “built-ins”) w powłokę bash, potrafi też robić więcej rzeczy - po podaniu odpowiednich parametrów. Tego jednak tematu nie będziemy rozwijać; dla zrozumienia istoty rzeczy wystarczy przeczytać stronę manuala bash(1). Przykład 8-1 pokazuje fragment wyjścia polecenia set uruchomionego na komputerze jednego z autorów (mowa o autorach oryginału angielskiego - przyp. tłum.). Zwróćcie uwagę na zmienną PATH, opisaną kilka akapitów wcześniej. Programy umieszczone w wylistowanych tam katalogach mogą być uruchamiane poprzez proste wpisanie tylko ich nazwy.

Przykład 8-1. Wypisanie zmiennych środowiskowych przy pomocy polecenia set

% set
PATH=/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin
PIPESTATUS=([0]="0")
PPID=4978
PS1='\h:\w\$ '
PS2='> '
PS4='+ '
PWD=/home/logan
QTDIR=/usr/local/lib/qt
REMOTEHOST=ninja.tdn
SHELL=/bin/bash

% unset VARIABLE

unset usunie podaną jako parametr zmienną, razem z jej wartością; bash zapomni, iż zmienna taka w ogóle kiedykolwiek istniała. (Nie martw się - dopóki jest to zmienna zdefiniowana na potrzeby jednej konkretnej sesji powłoki, to w innej sesji najprawdopodobniej zostanie zdefiniowana ponownie).

% export VARIABLE=some_value

Poznaj bardzo przydatne polecenie export. Używając go, nadajesz zmiennej środowiskowej VARIABLE wartość “some_value”; jeżeli zmienna VARIABLE nie istniała wcześniej - to teraz już istnieje. Jeżeli do VARIABLE była już przypisana jakaś wartość... cóż, właśnie została zmieniona. Nie brzmi to dobrze, gdy np. próbujesz jedynie dodać katalog do zmiennej PATH. W takim wypadku najlepiej będzie napisać:

% export PATH=$PATH:/some/new/directory

Zwróć uwagę na użycie w powyższym poleceniu zapisu $PATH. Jeżeli chcesz, by bash zinterpretował zmienną (operował nie na jej nazwie, lecz na wartości w niej przechowywanej) to dodaj znak $ przed nazwę zmiennej. Dla przykładu: polecenie echo $PATH w moim przypadku wypisze:

% echo $PATH
/usr/local/lib/qt/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:
/usr/openwin/bin:/usr/games:.:/usr/local/ssh2/bin:/usr/local/ssh1/bin:
/usr/share/texmf/bin:/usr/local/sbin:/usr/sbin:/home/logan/bin

8.3.2 Dopełnianie za pomocą tabulatora

Uwaga! Fajny rozdział :-)

  1. Linia poleceń oznacza dużo pisania.

  2. Pisanie to praca.

  3. Pracy nikt nie lubi.

Z punktów 3. i 2. można łatwo wywnioskować, że (4) nikt nie lubi pisania. Na szczęście bash ratuje nas przed zaistnieniem stwierdzenia (5) (nikt nie lubi linii poleceń).

W jaki sposób bash wywiązuje się z tego cudownego zadania, spytacie. Otóż, oprócz omówionego już uzupełniania za pomocą znaków uniwersalnych, bash oferuje uzupełnianie za pomocą klawisza tabulacji.

Owo uzupełnianie działa mniej więcej tak: wpisujesz nazwę pliku; może trzeba będzie go znaleźć w twojej zmiennej PATH, a może podajesz nazwę jednoznacznie. Jedyne co musisz zrobić to podanie takiej ilości znaków z nazwy pliku, by możliwa była jego jednoznaczna identyfikacja. Wtedy, po naciśnięciu klawisza tabulacji, bash odnajdzie żądany plik i wpisze za ciebie resztę jego nazwy!

Czas na przykład. /usr/src zawiera dwa podkatalogi: /usr/src/linux oraz /usr/src/sendmail. Chcesz obejrzeć zawartość /usr/src/linux. Tak więc wpisujesz po prostu ls /usr/src/l, naciskasz klawisz TAB, a wtedy bash uzupełnia resztę nazwy: ls /usr/src/linux.

Przypuśćmy teraz, że są tam takie dwa katalogi: /usr/src/linux oraz /usr/src/linux-old; jeżeli wpiszę /usr/src/l, po czym nacisnę TAB, bash uzupełni tyle, ile będzie w stanie uzupełnić, w wyniku czego otrzymam /usr/src/linux. Mogę na tym poprzestać, mogę też ponownie nacisnąć TAB - w drugim przypadku bash pokaże listę katalogów pasujących do podanego przeze mnie do tej pory wzorca.

Tak więc - o wiele mniej pisania (i za to lubimy linię poleceń). A nie mówiłem, że to będzie fajny rozdział?

Grenlandia 2012