Rozdział 11. bash, Kurs Linuxa, Linux


Rozdział 11.
bash


Rick McMullin i Tim Parker

W tym rozdziale:

Ten i dwa następne rozdziały pozwolą Ci poznać różne typy interpreterów poleceń dostępnych w systemie Linux: bash, pdksh i tcsh. Zaczniemy od omówienia powłoki bash (Bourne Again Shell), ponieważ jest ona w systemie Linux powłoką domyślną, w związku z czym korzysta z niej większość nowych użytkowników. Przyjrzymy się najczęściej wykorzystywanym poleceniom i zmiennym środowiskowym powłoki bash. Po przeczytaniu tego rozdziału będziesz potrafił pracować z tym interpreterem szybciej i wydajniej.

Po co komu interpreter poleceń

Czym tak właściwie jest interpreter poleceń powłoki? Jest to termin używany w systemie Linux bardzo często, ale jego znaczenie jest często mgliste dla początkujących (a czasem również bardziej zaawansowanych) użytkowników. Ten podrozdział wyjaśni Ci, co to takiego i dlaczego jest taki ważny.

Co to jest interpreter poleceń powłoki?

Interpreter poleceń powłoki to interfejs pomiędzy Tobą (czyli użytkownikiem) a Linuxem (albo bardziej precyzyjnie: jądrem systemu operacyjnego). Rysunek 11.1 obrazuje powiązania pomiędzy użytkownikiem, interpreterem poleceń powłoki (zwanym również

Rysunek 11.1.

Powiązania pomiędzy użytkownikiem, interpreterem poleceń i systemem operacyjnym

0x01 graphic

krócej powłoką lub interpreterem poleceń) i systemem operacyjnym. Każde polecenie, jakie wydajesz, używając Linuxa, jest interpretowane przez powłokę, a następnie przekazywane do jądra systemu.

0x01 graphic

Jeśli znasz system MS-DOS, dostrzegasz na pewno podobieństwo tych relacji do relacji pomiędzy użytkownikiem systemu DOS i programem COMMAND.COM. Jedyną różnicą jest fakt, że w systemie DOS interpreter poleceń jest scalony z jądrem systemu.

Interpreter poleceń obsługuje pewną liczbę poleceń wewnętrznych (ang. built-in). Umożliwia również uruchomienie wszystkich aplikacji i programów użytkowych dostępnych w systemie.

Wprowadzone przez użytkownika polecenie zawsze jest interpretowane przez powłokę. Na przykład w poprzednich rozdziałach, gdy wydawałeś polecenia, ucząc się zarządzać plikami i katalogami, powłoka interpretowała je, a następnie wykonywała albo uruchamiała odpowiednie programy.

Niektóre z poleceń (np. pwd) są wewnętrznymi poleceniami interpretera, inne to programy, które znajdują w katalogach gdzieś w systemie plików (na przykład rm lub cp). Z punktu widzenia użytkownika rozróżnienie takie nie jest istotne. Rysunek 11.2 pokazuje, w jaki sposób powłoka interpretuje polecenia.

Rysunek 11.2 ilustruje kroki podejmowane przez powłokę w celu zinterpretowania poleceń wydawanych przez użytkownika. Najpierw sprawdza ona, czy polecenie nie jest jednym z poleceń wewnętrznych (jak np. pwd). Jeśli nie, próbuje znaleźć i uruchomić odpowiedni program. Może to być zarówno standardowe polecenie Linuxa, jak ls czy rm, lub też jakaś aplikacja komercyjna, na przykład xv.

Interpreter poleceń szuka programów w katalogach zawartych w ścieżce przeszukiwania. Jak wspomnieliśmy w jednym z wcześniejszych rozdziałów, ścieżka przeszukiwania zawiera listę katalogów, w których można znaleźć pliki wykonywalne. Jeśli jednak przeszukiwanie nie zakończy się sukcesem (i oczywiście polecenie nie jest jednym z wewnętrznych poleceń powłoki), wyświetlony zostanie komunikat:

$ zrobto
zrobto: not found

Rysunek 11.2.

Interpretacja poleceń przez powłokę

0x01 graphic

Ostatnim etapem wykonania polecenia (jeśli może ono być zinterpretowane) jest rozbicie go na wywołania funkcji systemowych, przekazywane do jądra systemu.

Powłoka zawiera również potężny, interpretowany język programowania, zbliżony nieco do języka znanego z DOS-owych plików wsadowych, ale o wiele bardziej elastyczny. Obsługuje on większość konstrukcji, które dostępne są w językach wysokiego poziomu, takich jak pętle, funkcje, zmienne czy tablice.

Jak uruchamia się interpreter poleceń

Wiesz już, że interpreter poleceń jest podstawową metodą porozumiewania się użytkownika i jądra systemu. Jak jednak uruchamiany jest ten program? W systemie Linux jest on uruchamiany w momencie, gdy użytkownik zaloguje się do systemu. Zazwyczaj interpreter poleceń pozostaje uruchomiony aż do wylogowania.

Każdemu użytkownikowi przypisany jest domyślny interpreter poleceń. Informacja o nim znajduje się w pliku zawierającym hasła, czyli /etc/passwd. Zawiera on (miedzy innymi) identyfikator użytkownika, zakodowaną wersję hasła i nazwę programu, który należy uruchomić po zalogowaniu. Nie musi to być (choć prawie zawsze jest) interpreter poleceń Linuxa.

Najczęściej używane powłoki

W systemach linuxowych i UNIX-owych dostępnych jest kilka rodzajów powłok. Najpopularniejsze z nich to Bourne Shell (sh), C Shell (csh) i Korn Shell (ksh). Każda ma swoje wady i zalety.

Powłoka sh, której autorem jest Steven Bourne, jest podstawowym interpreterem poleceń w systemach UNIX-owych i jest dostępna w każdym z nich. Ma dość duże możliwości jeśli chodzi o obsługę skryptów, ale praca interaktywna nie jest jej najmocniejszą stroną.

Powłoka C Shell (csh), której autorem jest Billy Joy, jest o wiele wygodniejsza pod względem pracy interaktywnej (posiada na przykład takie ułatwienia jak automatyczne dokańczanie poleceń). Jeśli chodzi o programowanie, nie jest tak dobra jak sh, ale wielu programistów używa jej ze względu na fakt, że składnia poleceń jest zbliżona do składni języka C (stąd zresztą pochodzi jej nazwa).

Interpreter ksh, którego autorem jest Dave Korn, łączy w sobie zalety obu poprzednich powłok - jest wygodny zarówno jeśli chodzi o pracę interaktywną, jak i programowanie. Ponadto jest całkowicie kompatybilny z powłoką sh.

0x01 graphic

Na rynku dostępnych jest wiele dobrych książek o trzech wymienionych wyżej interpreterach poleceń. Jeśli chcesz ich używać, powinieneś zaopatrzyć się w którąś z nich. Ponieważ jednak większość użytkowników poprzestaje na powłokach rozprowadzanych z Linuxem, w dalszej części skupimy się właśnie na nich.

Poza wyżej wymienionymi, powstało wiele innych powłok, które dziedziczą podstawowe własności po jednym lub więcej interpreterze, tworząc jego nową wersję. Z większością dystrybucji Linuxa rozprowadzane są powłoki tcsh (rozszerzona wersja csh), bash (Bourne Again Shell, rozszerzona wersja powłoki sh) i pdksh (Public Domain Korn Shell, wersja powłoki ksh), które zostaną omówione bliżej w tym i dwóch następnych rozdziałach.

Powłoka Bourne Again Shell

Jak sama nazwa wskazuje, Bourne Again Shell to wersja powłoki Bourne Shell (sh). bash jest z nią całkowicie kompatybilny, ale zawiera wiele rozszerzeń i nowych rozwiązań. Przejął również niektóre zalety powłok csh i ksh. Jest to interpreter potężny i elastyczny jeśli chodzi o programowanie, a także przyjazny dla użytkownika pod względem pracy interaktywnej.

Dlaczego warto używać powłoki bash zamiast sh? Głównym powodem jest poprawiona obsługa interfejsu użytkownika. Wydawanie poleceń w interpreterze sh nie jest zbyt wygodne, jeśli więc regularnie i często wydajesz dużą liczbę poleceń, bash ma kilka cech mogących znacznie ułatwić Ci pracę.

Dokańczanie poleceń

Podczas wydawania polecenia jego pełne brzmienie często nie jest koniecznie do zrozumienia i prawidłowego zinterpretowania go. Dla przykładu załóżmy, że katalog bieżący zawiera następujące podkatalogi:

News/ bin/ games/ mail/ test/

Jeśli chcesz przejść do podkatalogu test, możesz wydać polecenie

cd test

Oczywiście działa ono prawidłowo. bash pozwala jednak zrobić to nieco szybciej i wygodniej. Ponieważ test to jedyny podkatalog zaczynający się na literę t, bash powinien domyślić się, że właśnie o ten katalog chodzi, gdy wpiszesz:

cd t

Jedynym podkatalogiem, do którego może odnosić się litera t, jest test. Jeśli chcesz, by bash dokończył polecenie za Ciebie, wciśnij klawisz Tab:

cd t<Tab>

Gdy to zrobisz, dokończone polecenie pojawi się na ekranie. Nie zostanie ono wykonane, dopóki nie zatwierdzisz go klawiszem Enter, dzięki czemu można sprawdzić, czy chodziło właśnie o to, co dopisał interpreter.

Przy wydawaniu krótkich poleceń (tak jak w powyższym przykładzie) korzystanie z tej możliwości nie ma większego sensu - może nawet wydłużyć czas ich wydawania. Dopiero gdy nabierzesz wprawy, a wydawane przez Ciebie polecenia staną się dłuższe, będziesz się zastanawiał, jak mogłeś wcześniej obejść się bez dokańczania poleceń.

Co się jednak stanie, gdy od litery t zaczynać się będzie nazwa więcej niż jednego podkatalogu? Stworzy to pewien problem, gdy będziesz chciał użyć dokańczania poleceń. Zobaczmy, jak potoczą się wypadki, gdy w katalogu bieżącym znajdują się następujące podkatalogi:

News/ bin/ mail/ test/ tools/ working/

W katalogu bieżącym znajdują się teraz dwa podkatalogi o nazwach zaczynających się na literę t. Jak używając dokańczania poleceń przejść do podkatalogu test? Jeśli wpiszesz jak poprzednio cd t<Tab>, bash nie będzie potrafił rozstrzygnąć, o który katalog chodzi.

W takim przypadku interpreter wygeneruje krótki dźwięk, który ma oznajmić, że potrzebne są dokładniejsze informacje. Wiersz poleceń nie zostanie zmieniony, dzięki czemu nie musisz ponownie wpisywać polecenia. Powinieneś teraz dopisać literę e i ponownie wcisnąć klawisz Tab. Powłoka potrafi już określić, który z katalogów miałeś na myśli. Jeśli chcesz wejść do podkatalogu tools, zamiast litery e powinieneś oczywiście dopisać o:

cd to<tab>

Gdy podczas wpisywania polecenia wciśnięty zostanie klawisz Tab, bash próbuje dokończyć polecenie. Jeśli nie jest to możliwe, dopisywane są znaki co do których nie ma wątpliwości, a następnie generowany jest dźwięk oznaczający konieczność podania dodatkowych informacji. Można następnie wpisać dodatkowe litery i ponownie wcisnąć klawisz Tab, powtarzając ten proces aż do chwili, gdy powłoka będzie potrafiła dokończyć polecenie.

Symbole wieloznaczne

Innym ułatwieniem dla użytkownika jest możliwość stosowania w wierszu poleceń symboli wieloznacznych. bash obsługuje trzy ich rodzaje:

* zastępuje dowolny znak lub ciąg znaków,

? zastępuje dowolny pojedynczy znak,

[...] zastępuje dowolny znak zawarty pomiędzy nawiasami.

Znak * może być używany w sposób podobny do dokańczania poleceń. Załóżmy na przykład, że w katalogu bieżącym znajdują się następujące podkatalogi:

News/ bin/ mail/ test/ working/

Jeśli chcesz przejść do katalogu test, możesz wydać polecenie cd test, użyć mechanizmu dokańczania poleceń:

cd t<tab>

lub użyć symbolu *:

cd t*

Symbol * zastępuje dowolny znak lub ciąg znaków, więc interpreter w miejsce t* podstawia nazwę test (jest to jedyna nazwa podkatalogu w katalogu bieżącym, która pasuje do wzorca).

Metoda ta działa prawidłowo wtedy, gdy tylko jedna nazwa podkatalogu zaczyna się na literę t. Jeśli jest ich więcej, wzorzec t* zostanie zastąpiony przez listę plików i podkatalogów rozpoczynających się na literę t. Polecenie cd spowoduje przejście do pierwszego katalogu z tej listy, niekoniecznie do tego, o który chodziło.

Bardziej praktyczne zastosowanie znaku * to wykonywanie poleceń na kilku plikach jednocześnie. Przykładowo, niech bieżący katalog zawiera następujące pliki:

ch1.doc ch2.doc ch3.doc chimp config mail/ test/ tools/

Jeśli chcesz wydrukować wszystkie pliki z rozszerzeniem .doc, możesz to łatwo zrobić wydając polecenie

lpr *.doc

W tym przypadku bash zastąpi wzorzec *.doc listą wszystkich plików z rozszerzeniem .doc znajdujących się w katalogu bieżącym. Ostatecznie polecenie to jest więc równoważne następującemu:

lpr ch1.doc ch2.doc ch3.doc

0x01 graphic

Zakładając, że zawartość bieżącego katalogu jest taka, jak w poprzednim przykładzie, pliki z rozszerzeniem .doc można również wydrukować każdym z poniższych poleceń:

lpr *doc
lpr *oc
lpr *c

Symbol ? działa podobnie jak symbol *, z tym że zastępuje dokładnie jeden znak. Jeśli zawartość katalogu bieżącego jest taka sama jak w poprzednim przykładzie, pliki ch1.doc ch2.doc ch3.doc wydrukować można poprzez wydawanie polecenia

lpr ch?.doc

Symbol [...] pozwala bardziej szczegółowo określić o jakie znaki lub zakresy znaków chodzi. Aby - tak jak w poprzednim przykładzie - wydrukować pliki ch1.doc ch2.doc ch3.doc, można wydać polecenie

lpr ch[123].doc

Inna możliwość to podanie zakresu znaków, np.:

lpr ch[1-3].doc

Przywoływanie wydanych poleceń

Interpreter bash zapamiętuje pewną liczbę wydanych wcześniej poleceń. Ich ilość określona jest wartością zmiennej środowiskowej HISTSIZE. Jeśli chcesz dowiedzieć się więcej o zmiennych tego typu, zajrzyj do podrozdziału „Zmienne powłoki bash”.

Kiedy logujesz się do systemu, lista wydanych poleceń ładowana jest z pliku, nazywanego plikiem historii - domyślnie jest to plik o nazwie .bash_history, znajdujący się w katalogu domowym. Jego nazwa przechowywana jest w zmiennej HISTFILE i może zostać zmieniona. Zauważ, że rozpoczyna się ona od kropki, czyli jest nazwą pliku ukrytego, wyświetlaną podczas przeglądania zawartości katalogu tylko na wyraźne żądanie, np. po wydaniu polecenia ls -a.

Samo zapamiętywanie wydanych poprzednio poleceń nie jest zbyt przydatne, więc bash udostępnia kilka sposobów przywoływania ich. Najłatwiej użyć w tym celu klawiszy kursora - strzałka w górę przywołuje wcześniejsze polecenie, natomiast do późniejszego wrócić można, naciskając klawisz ze strzałką w dół (podobnie jak w DOS-owym programie DOSKEY).

Jeśli zachodzi taka potrzeba, można edytować przywołane z listy polecenie. bash posiada dość złożony zestaw funkcji służących do tego celu, jednak omawianie ich wykracza poza zakres tej książki. Przy wprowadzaniu niewielkich poprawek można z powodzeniem stosować najprostsze metody, na przykład użyć klawiszy kursora - strzałki w lewo i w prawo pozwalają poruszać się w obrębie jednego polecenia. Tekst można wstawiać w dowolnym miejscu polecenia i usuwać klawiszami Delete czy Backspace. Większość użytkowników uważa takie możliwości za wystarczające.

0x01 graphic

Zestaw poleceń edycyjnych dostępnych w powłoce bash jest bardzo podobny do używanego w edytorach vi i emacs.

Używając poleceń history i fc, można również przeglądać i edytować plik historii. Polecenie history może zostać wywołane na dwa sposoby. Składnia pierwszego z nich jest następująca:

history [n]

Jeśli nie zostały podane żadne dodatkowe opcje, wyświetlana jest cała zawartość pliku historii, np.:

1 mkdir /usr/games/pool
2 cp XpoolTable-1.2.linux.tar.z /usr/games/pool
3 cd /usr/games/pool
4 ls
5 gunzip XpoolTable-1.2.linux.tar.z
6 tar -xf XpoolTable-1.2.linux.tar
7 ls
8 cd Xpool
9 ls
10 xinit
11 exit
12 which zip
13 zip
14 more readme
15 vi readme
16 exit

Użycie parametru n powoduje wyświetlenie tylko n ostatnich wierszy tego pliku, np. wydanie polecenia history 5 pozwala obejrzeć pięć ostatnio wydanych poleceń.

Drugi sposób wywołania tego polecenia używany jest do modyfikowania zawartości pliku historii. Polecenie history ma wtedy składnię:

history [-r|w|a|n] [nazwa_pliku]

Opcja -r powoduje, że plik o danej nazwie zostanie odczytany i będzie traktowany jako bieżący plik historii. Opcja -w powoduje zapisanie listy wydanych poleceń do pliku historii (usuwając jego dotychczasową zawartość). Opcja -a dopisuje wydane ostatnio polecenia do istniejącego pliku. Opcja -n powoduje, że wiersze pliku historii są wczytywane do listy ostatnio wydanych poleceń.

Wraz ze wszystkimi powyższymi opcjami można również podać nazwę pliku, który będzie używany jako plik historii. Jeśli nazwa ta nie jest podana, przyjmowana jest nazwa przechowywana w zmiennej HISTFILE.

Polecenie fc może również być używane do edycji listy wydanych poleceń na dwa sposoby. Pierwszy z nich ma następującą składnię:

fc [-e nazwa_edytora] [-n] [-l] [-r] [początek] [koniec]

Opcja -e nazwa_edytora pozwala podać, jaki edytor ma zostać użyty do edytowania poleceń. początek i koniec pozwalają wybrać zakres poleceń, które mają zostać pobrane z pliku historii. Mogą to być numery poleceń, bądź łańcuchy znaków, które polecenie fc będzie próbowało odnaleźć w pliku historii poleceń.

Opcja -n wyłącza numerowanie wierszy z poleceniami. Opcja -r wyświetla polecenia w odwrotnym porządku. Opcja -l przesyła znalezione polecenia na ekran. We wszystkich przypadkach oprócz opcji -l, wybrane polecenia ładowane są do edytora tekstu.

0x01 graphic

Edytor tekstu uruchamiany jest na podstawie nazwy podanej w opcji -e nazwa_edytora. Jeśli nie została ona podana, używany jest edytor wskazywany przez zmienną FCEDIT. Jeśli taka zmienna nie istnieje, używana jest wartość zmiennej EDITOR, a w końcu, jeśli i taka zmienna nie została zdefiniowana, uruchamiany jest program vi.

Aliasy

Aliasy to skróty dłuższych, często używanych poleceń, służące wygodzie użytkownika.

Jeśli na przykład regularnie wydajesz następujące polecenie:

cd /usr/X11/lib/X11/fvwm/sample-configs

wygodnie byłoby zastąpić je poleceniem krótszym, łatwiejszym do wpisania. Zamiast wpisywać za każdym razem wersję pierwotną, można stworzyć alias o nazwie np. goconfig, po wywołaniu którego nastąpi wykonanie pierwotnego, dłuższego polecenia. Aby utworzyć taki alias, trzeba skorzystać z polecenia alias powłoki bash:

alias goconfig='cd /usr/ X11/lib/X11/fvwm/sample-configs'

Od tego momentu aż do zamknięcia interpretera bash polecenie goconfig spowoduje wykonanie pierwotnego, o wiele dłuższego polecenia.

Jeśli uznasz, że dany alias nie jest już potrzebny, można usunąć go za pomocą polecenia unalias:
unalias goconfig

Jest kilka aliasów, które przydają się wielu użytkownikom. Warto zapisać je w pliku, który jest uruchamiany za każdym razem, gdy logujesz się do systemu. Oto przykłady takich aliasów:

alias ll='ls -l' pozwala uzyskać pełny opis zawartości katalogu za pomocą polecenia ll,

alias lo='logout' pozwala nieco szybciej się wylogować,

alias ls='ls -F' powoduje, że po wpisaniu polecenia ls wykona się ls -F, czyli przy nazwach katalogów wyświetlane będą symbole /.

Jeśli jesteś użytkownikiem systemu DOS, aliasy emulujące niektóre polecenia tego systemu mogą ułatwić Ci pracę:

0x01 graphic

W poleceniu definiującym aliasy po żadnej ze stron znaku równości nie powinno być spacji, ponieważ powłoka nie zinterpretuje wtedy polecenia prawidłowo. Cudzysłów konieczny jest tylko w przypadku, gdy polecenie zastępowane aliasem zawiera spacje lub inne znaki specjalne.

Polecenie alias wydane bez żadnych parametrów powoduje wyświetlenie informacji o wszystkich zdefiniowanych aktualnie aliasach. Oto przykładowy wynik działania takiego polecenia:

alias dir='ls'
alias copy='cp'
alias rename='mv'
alias md='mkdir'
alias net='term < /dev/modem > /dev/modem 2 > /dev/null &'
alias rd='rmdir'

Przekierowanie wejścia

Przekierowanie (lub przeadresowanie, ang. redirection) wejścia pozwala na zmianę źródła danych wykorzystywanych przez polecenie. Polecenia wydawane w interpreterze bash zwykle potrzebują jakichś informacji wejściowych, na przykład polecenie rm wymaga podania nazwy pliku czy plików, które mają zostać usunięte. Jeśli informacje te nie zostaną podane, polecenie rm wygeneruje komunikat o błędzie albo wskazówkę o sposobie uzyskania dodatkowych informacji o jego składni.

Inne polecenia wymagają o wiele bardziej złożonych danych wejściowych. Dane takie zwykle umieszcza się w pliku. Przykładowo, polecenie wc (ang. word count, licz słowa) zlicza znaki, słowa i wiersze tekstu, który jest podany na jego wejście. Jeśli polecenie wc wydane zostanie bez żadnych argumentów, program będzie czekał na wprowadzenie tekstu, w którym zostaną zliczone słowa. Wygląda to tak, jakby interpreter przestał działać: co prawda wszystko, co wpisujesz, pojawia się na ekranie, ale polecenia nie są wykonywane. Możesz przerwać wpisywanie danych wciskając Control+D. Wtedy wyniki działania programu wc zostaną wyświetlone na ekranie. Jeśli jako parametr programu wc podana zostanie nazwa pliku, zostanie on potraktowany jako plik wejściowy, np.:

wc test
11 2 1

Inną metodą podania zawartości pliku test na wejście programu wc jest przekierowanie wejścia, czyli poinformowanie interpretera poleceń, że dane mają zostać odczytane nie z konsoli, ale z pliku test. Służy do tego operator <. W naszym przypadku operacja ta wyglądałaby tak:

wc < test
11 2 1

Przekierowanie wejścia wykorzystywane jest dość rzadko, ponieważ programy pobierające dane z pliku wejściowego zazwyczaj posiadają opcję pozwalająca podać jego nazwę w wierszu poleceń. Możesz jednak znaleźć się w sytuacji, gdy będziesz musiał przekazać zawarte w pliku dane do polecenia nie posiadającego takiej możliwości. W takiej sytuacji przeadresowanie wejścia wybawi Cię z kłopotu.

Przekierowanie wyjścia

Przekierowanie wyjścia używane jest o wiele częściej niż przekierowanie wejścia. Pozwala ono przesłać wyniki działania programu do pliku (lub urządzenia ­- przyp. tłum.), zamiast wyświetlać je na ekranie terminalu.

Możliwość przeadresowania wyjścia przydaje się w wielu sytuacjach. Może się np. zdarzyć, że wyniki wykonania polecenia nie mieszczą się na ekranie, wygodnie jest wówczas zapisać je do pliku i przeglądać później za pomocą edytora tekstu. Czasem również zachodzi potrzeba zachowania wyników działania programu, by je komuś pokazać lub wydrukować. Mechanizm ten bywa przydatny również wtedy, gdy wyniki działania jednego polecenia mają być później wykorzystane jako dane wejściowe innego programu (wyjście jednego polecenia na wejście drugiego można podać również używając mechanizmu potoków - ang. pipes - omówionego w następnym podrozdziale).

Przekierowania wyjścia można dokonać bardzo podobnie jak wejścia, tyle że zamiast symbolu < należy użyć znaku >.

0x01 graphic

Najłatwiej zapamiętać, który symbol służy do przekierowania wejścia, a który wyjścia, wyobrażając sobie lejek (symbole < i > przypominają go nieco kształtem), którego wąska końcówka wprowadza dane do polecenia lub pliku. Szersza końcówka lejka - obojętnie czy w symbolu < czy > - zawsze wskazuje na miejsce, skąd dane mają być pobierane.

Aby np. zapisać zawartość katalogu wyświetlaną poleceniem ls w pliku katalog, należy więc wydać polecenie:

ls > katalog

Ciągi poleceń

Ciągi poleceń (nazywane też potokami, ang. pipes) umożliwiają połączenie kilku poleceń tak, by wyjście poprzedniego stanowiło wejście następnego. Wyniki wykonania ostatniego z poleceń wyświetlane są na ekranie (lub przesyłane do pliku, jeśli zostały przekierowane).

Ciągi poleceń tworzy się oddzielając poszczególne polecenia symbolem |, np.:

cat przyklad | grep "Koniecznie" | wc -l

Wyjście polecenia cat (wyświetlającego zawartość pliku) zostanie skierowane na wejście programu grep (który wyświetli wszystkie wiersze zawierające tekst Koniecznie), a jego wyjście na wejście programu wc (opcja -l powoduje, że zliczane są tylko wiersze tekstu). Wyjście tego ostatniego zostanie wyświetlone na ekranie.

Pokażmy może wynik działania takiego ciągu poleceń na rzeczywistym pliku. Niech w pliku plan_dnia znajduje się następujący tekst:

Plan na dzisiaj:
Kupić kasety
Odebrać zdjęcia
Koniecznie oddać film
Koniecznie zapłacić za prąd

Wynikiem działania powyższego ciągu poleceń jest liczba 2, która oznacza, że są dwie rzeczy, które musisz dziś koniecznie zrobić:

cat plan_dnia | grep "Koniecznie" | wc -l
2

Znak zachęty

Znak zachęty to tekst, który jest wyświetlany przez powłokę, by zakomunikować użytkownikowi, że oczekuje ona na wprowadzenie danych. W powłoce bash istnieją dwa poziomy znaków zachęty. Znak zachęty pierwszego poziomu sygnalizuje, że interpreter oczekuje na wydanie polecenia; zazwyczaj jest to znak $ lub %. Jest on przechowywany jako wartość zmiennej PS1. Zmieniając wartość tej zmiennej możesz sprawić, że wyświetlany będzie dowolny tekst, na przykład

PS1="Wprowadz polecenie"

Znak zachęty drugiego poziomu wyświetlany jest, gdy bash oczekuje na podanie dodatkowych informacji niezbędnych do wykonania polecenia. Domyślnie wyświetlany jest w takiej sytuacji symbol >. Postać tego znaku zachęty określona jest wartością zmiennej PS2 i można ją zmienić na przykład w taki sposób:

PS2="Podaj wiecej danych"

Poza wyświetlaniem tekstów statycznych, istnieje również możliwość użycia kilku symboli specjalnych, które powodują wyświetlenie informacji takich jak bieżący katalog czy aktualny czas. Tabela 11.1 zawiera najczęściej używane spośród tych symboli.

Tabela 11.1. Kody specjalne używane przy wyświetlaniu znaku zachęty

Symbol

Znaczenie

\!

Wyświetla kolejny numer polecenia w historii poleceń

\#

Wyświetla numer aktualnego polecenia

\$

Wyświetla znak $, jeśli użytkownik nie jest zalogowany jako root, w przeciwnym wypadku wyświetla #

\\

Wyświetla znak \

\d

Wyświetla aktualną datę

\h

Wyświetla nazwę komputera

\n

Przechodzi do następnego wiersza

\nnn

Wyświetla znak, który odpowiada ósemkowej wartości nnn.

\s

Wyświetla nazwę powłoki

\t

Wyświetla aktualny czas

\u

Wyświetla identyfikator użytkownika

\W

Wyświetla podstawową nazwę bieżącego katalogu

\w

Wyświetla nazwę bieżącego katalogu

Powyższe symbole mogą być łączone, co pozwala na tworzenie znaków zachęty zawierających różne przydatne informacje. Poniżej podajemy przykładowe wartości zmiennej PS1.

PS1="\t"
Tej wartości zmiennej PS1 odpowiada znak zachęty o następującej postaci (nie ma po nim spacji):
02:16:15

Wpisanie

PS1=\t
powoduje, że jako znak zachęty wyświetlany będzie tekst
t

Widać więc, jak ważne jest stosowanie cudzysłowów. Natomiast zmienna PS1 o wartości

PS1="\t\\ "
daje następujący znak zachęty:
02:16:30\

W tym przypadku po ostatnim znaku jest spacja, ponieważ znalazła się ona na końcu tekstu będącego wartością zmiennej PS1.

Zarządzanie zadaniami

Zarządzanie zadaniami to zdolność kontrolowania zachowań aktualnie działających procesów. Mówiąc konkretniej, jest to możliwość uśpienia (wstrzymania, ang. suspend) działającego procesu i późniejszego uruchomienia go. Interpreter bash śledzi wszystkie uruchamiane procesy (uruchamiane przez użytkownika, nie przez inne procesy) i pozwala je wstrzymywać oraz przywracać w dowolnej chwili (więcej informacji na ten temat znajdziesz w rozdziale 34. „Procesy”).

Wciśnięcie klawiszy Control+Z powoduje wstrzymanie działającego procesu. Polecenie bg uruchamia go ponownie w tle, natomiast polecenie fg - na pierwszym planie. Polecenia te są najczęściej używane w przypadku, gdy użytkownik przez pomyłkę uruchomi na pierwszym planie program, który miał zostać uruchomiony w tle. Program uruchomiony na pierwszym planie blokuje dostęp do interpretera poleceń i nie pozwala użytkownikowi na zrobienie czegokolwiek aż do momentu zakończenia swojego działania. Zazwyczaj nie jest to problemem, ponieważ większość poleceń potrzebuje na zakończenie działania co najwyżej kilku sekund, ale w przypadku programów, które działają długo, wygodniej jest uruchomić je w tle, by móc nadal używać interpretera.

Jeśli na przykład uruchomisz polecenie find / -name "test" >find.out (które przeszukuje cały system plików w poszukiwaniu pliku o nazwie test, wysyłając wyniki do pliku find.out) na pierwszym planie, na wyniki będziesz musiał poczekać od kilkunastu sekund do kilku minut, zależnie od wielkości systemu plików. W takim przypadku można wcisnąć klawisze Control+Z, co spowoduje wstrzymanie programu find, a następnie wydać polecenie bg, które uruchomi go ponownie w tle, dzięki czemu można będzie znów używać interpretera poleceń.

Dostosowywanie interpretera bash

W tym rozdziale opisano już kilka sposobów dostosowywania powłoki do własnych potrzeb i przyzwyczajeń. Jednak wprowadzone usprawnienia działały tylko do momentu wylogowania się z systemu. Można uczynić je bardziej trwałymi poprzez zapisanie odpowiednich poleceń w pliku inicjalizacyjnym.

Do pliku inicjalizacyjnego powłoki bash można wpisać dowolne polecenia, które mają być wykonywane przy każdym uruchomieniu powłoki, na przykład zestaw poleceń alias czy polecenia nadające odpowiednie wartości zmiennym środowiskowym.

Plik inicjalizacyjny nazywa się .profile lub .bash_profile, zależnie od wersji Linuxa. Dla uproszczenia przyjmijmy, że nazywa się on .profile. Każdy, kto używa interpretera bash, posiada taki plik w swoim katalogu domowym. Jest on odczytywany podczas uruchamiania interpretera i wykonywane są wówczas wszystkie zawarte w nim polecenia.

Wiele systemów linuxowych używa domyślnego pliku inicjalizacyjnego profile (zauważ, że przed jego nazwą nie ma kropki). Jest on zapisany w katalogu /etc. Jeśli chcesz dostosować interpreter bash do swoich potrzeb, powinieneś skopiować ten plik do swojego katalogu domowego, zmienić jego nazwę na .profile i wprowadzić odpowiednie modyfikacje.

0x01 graphic

Niektóre wersje programu instalacyjnego robią automatycznie kopię pliku .profile w katalogu domowym podczas zakładania konta dla nowego użytkownika. Nie jest to jednak regułą, więc powinieneś to sprawdzić, pamiętając o tym, że pliki o nazwach zaczynających się od kropki domyślnie nie są wyświetlane. Aby je zobaczyć musisz użyć polecenia ls -a lub ls -A.

Polecenia powłoki bash - podsumowanie

Niektóre z bardziej przydatnych poleceń powłoki bash zabrano w tabeli 11.2

Tabela 11.2. Niektóre polecenia powłoki bash

Polecenie

Funkcja

alias

Umożliwia tworzenie aliasów (skróconych nazw poleceń)

bg

Powoduje, że wstrzymany proces kontynuuje działanie w tle

cd

Przechodzi do katalogu, którego nazwa podana jest jako argument

exit

Kończy działanie powłoki

export

Powoduje, że wartość zmiennej będzie dostępna dla wszystkich procesów potomnych

fc

Pozwala na edycję historii poleceń

fg

Powoduje, że wstrzymany proces kontynuuje wykonywanie na pierwszym planie

help

Wyświetla informacje o wbudowanych w interpreter poleceniach

history

Wypisuje listę ostatnio używanych poleceń

kill

Służy do zatrzymywania procesów

pwd

Wyświetla nazwę katalogu bieżącego

unalias

Usuwa alias

Interpreter bash posiada jeszcze wiele innych poleceń wewnętrznych, ale w tabeli znajdują się tylko te najczęściej używane. Informacje o pozostałych poleceniach znajdziesz na stronach man (które możesz obejrzeć po wydaniu polecenia man bash).

Zmienne powłoki bash

Konfiguracja powłoki bash określona jest przez wartości wielu zmiennych konfiguracyjnych. Najbardziej przydatne z nich wraz z krótkim opisem zebrane zostały w tabeli 11.3.

Tabela 11.3. Najbardziej przydatne zmienne powłoki bash

Nazwa zmiennej

Znaczenie

EDITOR, FCEDIT

Domyślny edytor polecenia fc

HISTFILE

Nazwa pliku historii poleceń

HISTSIZE

Rozmiar historii poleceń

HOME

Nazwa katalogu domowego bieżącego użytkownika

OLDPWD

Poprzedni katalog bieżący

PATH

Ścieżka przeszukiwania

PS1

Znak zachęty pierwszego poziomu

PS2

Znak zachęty drugiego poziomu (wyświetlany, gdy konieczne jest podanie dodatkowych informacji)

PWD

Nazwa bieżącego katalogu

SECONDS

Liczba sekund, które upłynęły od uruchomienia powłoki bash

Zmiennych używanych przez powłokę bash jest znacznie więcej, niż tu podaliśmy. Jak zwykle, dokładniejsze informacje znaleźć możesz na stronach man.

Podsumowanie

W tym rozdziale przedstawiliśmy kilka użytecznych cech interpretera poleceń bash. Wiesz już, jak działa dokańczanie poleceń, aliasy i zarządzanie zadaniami, co pozwoli Ci usprawnić pracę z tą powłoką.

W następnym rozdziale przyjrzymy się innemu interpreterowi poleceń dostępnemu w systemach linuxowych. Będzie to Public Domain Korn Shell (pdksh). On również posiada wiele udogodnień, dzięki czemu masz w zasadzie wolną rękę przy wyborze powłoki, z którą chcesz pracować. Jeśli chcesz, możesz ominąć następny rozdział i przejść do innych tematów.

Więcej o programowaniu w języku powłoki możesz dowiedzieć się z rozdziału 14. „Programowanie w języku powłoki”.

Edytory tekstu, których użyć można do tworzenia i edytowania plików, omówione są w rozdziale 16. „Edytory tekstu: vi i emacs”.

224 Część II Poznawanie Linuxa

224 E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\11.DOC

E:\Moje dokumenty\HELION\Linux Unleashed\Indeks\11.DOC 223

Rozdział 11. bash 223



Wyszukiwarka

Podobne podstrony:
Rozdział 13. tcsh, Kurs Linuxa, Linux
Rozdział 12. pdksh, Kurs Linuxa, Linux
Rozdział 16. Edytory tekstu- vi i emacs, Kurs Linuxa, Linux
Rozdział 9. Prawa dostępu do plików i katalogów, Kurs Linuxa, Linux
Rozdział 15. FTP oraz Telnet, Kurs Linuxa, Linux
Rozdział 4. LILO, Kurs Linuxa, Linux
Rozdział 1. Wstęp do Linuxa, Kurs Linuxa, Linux
00 - Wstęp, Kurs Linuxa, Linux
ostre białaczki 24 11 2008 (kurs)
MLP FIM Fanfic Wojna o Equestrię Rozdział 11
AutoCAD - Kurs zaawansowany - Lekcja 11, autocad kurs, Zaawansowany
Rozdział 11, Choroby zakaźne i pasożytnicze - Zdzisław Dziubek
Rozdział 11, Giełda
Bauman Zygmunt - Socjologia, Rozdział 11 - Jak sobie dajemy radę w życiu
rozdział 11
Rozdział 11
rozdzial 11 zadanie 03
(1995) WIEDZA KTÓRA PROWADZI DO ŻYCIA WIECZNEGO (DOC), rozdział 11, Rozdział 1

więcej podobnych podstron