Powłoka bash

Transkrypt

Powłoka bash
ROZDZIAĤ 1.
Podstawy powĥoki bash
PopularnoĈè systemu Unix stale wzrasta od chwili jego powstania, to jest od wczesnych lat 70.
W tym czasie powstaäo wiele róĔnych wersji systemu, noszñcych takie nazwy jak Ultrix, AIX,
Xenix, Unos i Linux. Poczñtkowo Unix byä wykorzystywany na minikomputerach i komputerach mainframe, jednak z czasem zaczöto go instalowaè równieĔ na biurkowych stacjach roboczych, a nawet na komputerach osobistych wykorzystywanych w domu i w pracy. Unix nie
jest juĔ uĔytkowany jedynie przez komputerowych zapaleþców na uniwersytetach i w centrach
naukowych. Jest takĔe wykorzystywany w biznesie, szkoäach i w domach. Z biegiem czasu coraz wiöcej osób bödzie miaäo stycznoĈè z Uniksem.
Czytelnik mógä juĔ uĔywaè systemu Unix w szkole, biurze albo w domu do uruchamiania aplikacji, drukowania dokumentów i odczytywania poczty elektronicznej. Maäo kto jednak zastanawia siö nad mechanizmami uruchamianymi po wpisaniu polecenia i naciĈniöciu klawisza
RETURN.
Po wpisaniu polecenia przetwarzanie odbywa siö w róĔnych warstwach systemu, jednak w niniejszej ksiñĔce zajmiemy siö tylko warstwñ najwyĔszego poziomu, którñ jest powäoka. Ogólnie mówiñc, powäoka to dowolny interfejs uĔytkownika do systemu operacyjnego Unix, czyli
kaĔdy program, który pobiera dane wejĈciowe od uĔytkownika, täumaczy je na instrukcje zrozumiaäe dla systemu operacyjnego, a takĔe przekazuje uĔytkownikowi dane wyjĈciowe wygenerowane przez system operacyjny. Na rysunku 1.1 przedstawiono relacje miödzy uĔytkownikiem, powäokñ i systemem operacyjnym.
Rysunek 1.1. Powäoka jest warstwñ otaczajñcñ system operacyjny Unix
15
Istnieje szereg róĔnych typów interfejsów uĔytkownika. Powäoka bash naleĔy do najbardziej popularnej kategorii: znakowych interfejsów uĔytkownika. Tego typu interfejsy przyjmujñ tekstowe wiersze poleceþ wpisywanych przez uĔytkownika i zwykle generujñ dane wyjĈciowe równieĔ w postaci tekstowej. Do innych kategorii zalicza siö coraz bardziej popularne graficzne
interfejsy uĔytkownika (GUI), które pozwalajñ na wyĈwietlanie okreĈlonych elementów graficznych (a nie tylko graficznego obrazu liter) i przyjmujñ dane wejĈciowe generowane przez mysz
lub inne urzñdzenia wskazujñce, interfejsy w postaci ekranów dotykowych (obecne na przykäad
w niektórych rodzajach bankomatów) itp.
Czym jest powĥoka?
Zadaniem powäoki jest täumaczenie wierszy poleceþ uĔytkownika na instrukcje systemu operacyjnego. Spójrzmy na poniĔsze polecenie:
sort -n lista > lista.posortowana
Polecenie to oznacza: „Posortuj w porzñdku liczbowym wiersze znajdujñce siö w pliku lista
i umieĈè wyniki w pliku o nazwie lista.posortowana”. Oto czynnoĈci wykonywane przez powäokö w odpowiedzi na to polecenie:
1. Podziaä wiersza na nastöpujñce fragmenty: sort, -n, lista, > i lista.posortowana. Fragmenty te to tak zwane säowa.
2. Ustalenie znaczenia poszczególnych säów: sort jest poleceniem, -n i lista to argumenty,
a > i lista.posortowana zäñczone razem stanowiñ instrukcjö wejĈcia-wyjĈcia.
3. Ustawienie wejĈcia-wyjĈcia zgodnie z zapisem > lista.posortowana (przesäanie wyników
do pliku lista.posortowana) oraz kilka wewnötrznych, standardowych kroków.
4. Odnalezienie pliku z poleceniem sort i jego uruchomienie z opcjñ -n (porzñdek liczbowy)
oraz argumentem lista (nazwa pliku wejĈciowego).
OczywiĈcie, kaĔdy z tych kroków skäada siö z kilku pomniejszych czynnoĈci, a kaĔda z nich
zawiera konkretnñ instrukcjö systemu operacyjnego.
NaleĔy pamiötaè, Ĕe sama powäoka nie jest systemem Unix — jest to jedynie interfejs do systemu. Unix jest jednym z pierwszych systemów operacyjnych, w których interfejs uĔytkownika
jest caäkowicie niezaleĔny od samego systemu.
Zakres ksiéŜki
W niniejszej ksiñĔce zostaäa opisana powäoka bash, bödñca jednñ z najnowszych i najbogatszych
spoĈród najpopularniejszych powäok Uniksa. Powäoki bash moĔna uĔywaè na dwa sposoby:
jako interfejsu uĔytkownika oraz jako Ĉrodowiska programistycznego.
Ten i nastöpny rozdziaä dotyczñ interaktywnej pracy z powäokñ. Informacje zawarte w obydwu
rozdziaäach powinny daè wystarczajñcñ podstawö do sprawnego i wydajnego uĔywania powäoki w zakresie najczöĈciej wykonywanych zadaþ.
UĔywanie powäoki niewñtpliwie pozwoli na zidentyfikowanie niektórych charakterystycznych
cech Ĉrodowiska, które warto bödzie dostosowaè, oraz zadaþ, które moĔna zautomatyzowaè.
Kilka sposobów osiñgniöcia tych celów zostanie przedstawionych w rozdziale 3.
16
_
Rozdziaĥ 1. Podstawy powĥoki bash
Rozdziaä 3. wprowadza równieĔ do zagadnieþ zwiñzanych z programowaniem powäoki, które
szczegóäowo przedstawiane sñ w rozdziaäach od 4. do 6. Zrozumienie prezentowanych zagadnieþ i nauczenie siö programowania powäoki nie wymaga Ĕadnego doĈwiadczenia programistycznego. W rozdziaäach 7. i 8. znajdujñ siö szczegóäowe informacje na temat operacji wejĈcia-wyjĈcia powäoki oraz mechanizmów obsäugi procesów, natomiast w rozdziale 9. opisywane sñ
róĔne techniki debugowania programów powäoki.
Z niniejszej ksiñĔki moĔna dowiedzieè siö bardzo wiele na temat powäoki bash, a takĔe na temat narzödzi Uniksa oraz sposobu, w jaki ten system dziaäa. MoĔna nawet zostaè doskonaäym
programistñ powäoki i to bez Ĕadnego wczeĈniejszego doĈwiadczenia programistycznego. JednoczeĈnie staraliĈmy siö zanadto nie zagäöbiaè w szczegóäy wewnötrznych mechanizmów Uniksa. Stoimy bowiem na stanowisku, Ĕe wcale nie trzeba szczegóäowo znaè wewnötrznych mechanizmów systemu, by móc efektywnie uĔywaè jego powäoki i programowaè jñ. Pominiöte
zostanie zatem kilka funkcji powäoki, które przeznaczone sñ wyäñcznie dla programistów korzystajñcych z niskopoziomowych mechanizmów systemu.
Historia powĥok Uniksa
NiezaleĔnoĈè powäoki od systemu operacyjnego spowodowaäa, Ĕe na przestrzeni lat powstaäo
wiele róĔnych powäok Uniksa. Jednak tylko kilka z nich jest powszechnie uĔywanych.
Pierwszñ waĔnñ powäokñ byäa powäoka Bourne (nazwana tak od nazwiska jej twórcy, Stevena
Bourne’a), doäñczona do pierwszej ogólnodostöpnej wersji Uniksa, wersji 7, w 1979 roku. W systemie powäoka Bourne nosi oznaczenie sh. Sam Unix przeszedä wiele zmian, lecz powäoka
Bourne wciñĔ cieszy siö popularnoĈciñ i zasadniczo siö nie zmienia. Korzystajñ z niej róĔne narzödzia i mechanizmy administracyjne Uniksa.
Nastöpnñ powszechnie uĔywanñ powäokñ byäa powäoka C, czyli csh, którñ napisaä Bill Joy
z Uniwersytetu Kalifornia w Berkeley. Stanowiäa ona czöĈè Berkeley Software Distribution (BSD)
— wersji systemu Unix opublikowanej kilka lat po pojawieniu siö wersji 7.
Powäoka C zawdziöcza swñ nazwö podobieþstwu udostöpnianych poleceþ do instrukcji jözyka programowania C, co bardzo uäatwia jej poznanie programistom korzystajñcym z systemu
Unix. Powäoka ta obsäuguje szereg funkcji (na przykäad sterowanie zadaniami — wiöcej na
ten temat w rozdziale 8.) charakterystycznych wówczas tylko dla systemu BSD Unix, które
jednak sñ teraz obecne w wiökszoĈci bieĔñcych wersji Uniksa. Posiada takĔe kilka istotnych
wäaĈciwoĈci (takich jak aliasy — wiöcej na ten temat w rozdziale 3.) uäatwiajñcych jej stosowanie.
W ostatnich latach popularnoĈè zdobyäo kilka innych powäok. NajwaĔniejszñ z nich jest powäoka Korn. Jest to produkt komercyjny, äñczñcy w sobie najlepsze cechy powäok Bourne
oraz C i zawierajñcy wiele rozwiñzaþ autorskich1. Powäoka Korn w wielu aspektach przypomina powäokö bash — na przykäad obydwie oferujñ caäy zbiór moĔliwoĈci uäatwiajñcych pracö z nimi. Powäoka bash jest jednak rozprowadzana na licencji GPL (General Public License).
Wiöcej informacji na temat powäoki Korn znajduje siö w dodatku A).
1
Powäokö Korn moĔna pobraè za darmo, lecz warunki licencji wymagajñ uiszczenia zapäaty w przypadku wykorzystywania jej w pewnych sytuacjach.
Historia powĥok Uniksa
_
17
Powĥoka Bourne Again
Powäoka Bourne Again (nazwana tak dla upamiötnienia powäoki Steve’a Bourne’a) zostaäa
stworzona dla celów projektu GNU2. Projekt GNU zostaä zainicjowany przez Richarda Stallmana z fundacji Free Software Foundation (FSF), a jego celem jest utworzenie systemu operacyjnego zgodnego z Uniksem i zastöpowanie wszystkich komercyjnych narzödzi Uniksa ich
otwartymi odpowiednikami. Projekt GNU to jednak nie tylko nowe programy narzödziowe,
ale równieĔ nowy sposób dystrybucji, tzw. copyleft. Oprogramowanie dystrybuowane na
zasadzie copyleft moĔe byè udostöpniane bez ograniczeþ, jeĈli tylko nie sñ nakäadane Ĕadne
ograniczenia co do jego dalszego rozprowadzania (na przykäad kod Ēródäowy musi byè ogólnodostöpny).
Powäoka bash, która zostaäa pomyĈlana jako standardowa powäoka systemu GNU, ujrzaäa Ĉwiatäo dzienne w niedzielö 10 stycznia 1988 roku. Brian Fox napisaä pierwotnñ wersjö powäoki
bash i interfejsu readline, po czym rozbudowywaä powäokö aĔ do roku 1993. Na poczñtku 1989
roku doäñczyä do niego Chet Ramey, którego zadaniem byäo usuniöcie bäödów wystöpujñcych
wówczas w powäoce i doäñczenie wielu nowych uĔytecznych udogodnieþ. Obecnie Chet Ramey
jest oficjalnie odpowiedzialny za utrzymanie powäoki bash i jej dalszñ rozbudowö.
Zgodnie z zasadami GNU wszystkie wersje powäoki bash od wersji 0.99 wzwyĔ sñ udostöpniane za darmo przez FSF. Powäoka bash znalazäa siö we wszystkich waĔniejszych odmianach
Uniksa i obecnie szybko staje siö najpopularniejszñ powäokñ wywodzñcñ siö od powäoki Bourne. JednoczeĈnie jest to standardowa powäoka doäñczana do Linuksa — szeroko wykorzystywanego darmowego systemu operacyjnego z rodziny Unix — oraz do systemu Mac OS X
firmy Apple.
W 1995 roku Chet Ramey rozpoczñä pracö nad nowñ wersjñ gäównñ, 2.0, która zostaäa opublikowana po raz pierwszy 23 grudnia 1996 roku. W powäoce bash 2.0 znalazä siö caäy szereg
funkcji nieobecnych we wczeĈniejszej wersji (oznaczonej numerem 1.14.7), zwiökszyä siö takĔe
zakres jej zgodnoĈci z róĔnymi standardami. Powäoka bash 3.0 stanowi dalsze ulepszenie poprzednich wersji i dalej rozszerza zakres dostöpnych moĔliwoĈci i zgodnoĈè ze standardami.
Niniejsza ksiñĔka opisuje powäokö bash 3.0 i jest zgodna równieĔ z wszystkimi wczeĈniejszymi wersjami. W tekĈcie zostanñ wskazane wszystkie mechanizmy obecne w bieĔñcej wersji, które róĔniñ siö od mechanizmów we wczeĈniejszych wersjach lub w ogóle nie sñ w nich dostöpne.
Cechy powĥoki
Wprawdzie to powäoka Bourne wciñĔ okreĈlana jest mianem „standardowej”, lecz bash zdobywa coraz wiökszñ popularnoĈè. Oprócz zgodnoĈci z powäokñ Bourne bash oferuje najlepsze rozwiñzania zastosowane w powäokach C i Korn, a takĔe kilka rozwiñzaþ charakterystycznych
tylko dla niej.
Cechñ, która najbardziej przekonuje uĔytkowników do powäoki bash, sñ tryby edycji w wierszu
poleceþ. Dziöki moĔliwoĈci edycji w wierszu poleceþ znacznie äatwiej jest siö cofnñè i poprawiè popeänione bäödy albo zmodyfikowaè polecenia wpisane wczeĈniej, niĔ ma to miejsce
w przypadku mechanizmu historii powäoki C. Z kolei powäoka Bourne w ogóle nie pozwala
na wykonywanie takich dziaäaþ.
2
GNU to rekurencyjny akronim wyraĔenia „GNU’s Not Unix”.
18
_
Rozdziaĥ 1. Podstawy powĥoki bash
Kolejnñ waĔnñ funkcjñ powäoki bash, opracowanñ gäównie z myĈlñ o uĔytkownikach interaktywnych, jest sterowanie zadaniami. Jak zostanie wyjaĈnione w rozdziale 8., sterowanie zadaniami pozwala na zatrzymywanie, uruchamianie i wstrzymywanie wiökszej liczby poleceþ
w tym samym czasie. WäaĈciwoĈè ta zostaäa niemal bez zmian zapoĔyczona z powäoki C.
Pozostaäe najwaĔniejsze zalety powäoki bash dotyczñ przede wszystkim osób przywiñzujñcych
wagö do moĔliwoĈci jej dostosowywania oraz programistów. Powäoka ta udostöpnia wiele nowych opcji i zmiennych dostosowujñcych, a zawarte w niej mechanizmy programistyczne zostaäy znacznie rozszerzone, miödzy innymi o definiowanie funkcji, dodatkowe struktury sterujñce, arytmetykö caäkowitoliczbowñ i zaawansowane sterowanie wejĈciem-wyjĈciem.
Uaktywnianie powĥoki bash
Byè moĔe czytelnik ma od razu moĔliwoĈè korzystania z powäoki bash. Administrator systemu zwykle konfiguruje konto uĔytkownika w taki sposób, Ĕe udostöpnia ono powäokö majñcñ
w systemie status „standardowej”. UĔytkownik moĔe nawet nie zdawaè sobie sprawy, Ĕe dostöpna jest wiöcej niĔ jedna powäoka.
Na szczöĈcie bardzo äatwo moĔna ustaliè, jaka powäoka jest aktualnie uĔywana. W tym celu
naleĔy zalogowaè siö do systemu i w wierszu poleceþ wpisaè polecenie echo $SHELL. W odpowiedzi wyĈwietlona zostanie odpowiedĒ sh, csh, ksh lub bash, oznaczajñca odpowiednio powäoki Bourne, C, Korn i bash. (MoĔe siö takĔe okazaè, Ĕe uĔywana jest jeszcze inna powäoka, na
przykäad tcsh).
JeĔeli powäoka bash nie jest dostöpna, wówczas w celu jej uaktywnienia trzeba najpierw sprawdziè, czy w ogóle jest obecna w systemie. W tym celu wystarczy wpisaè bash. JeĔeli znak zachöty zmieni siö i przyjmie postaè jakiejĈ informacji zakoþczonej znakiem dolara (na przykäad
bash3 $), bödzie to oznaczaè, Ĕe wszystko jest w porzñdku. Wystarczy wtedy wpisaè polecenie exit, aby wróciè do zwykäej powäoki.
JeĈli natomiast wyĈwietlony zostanie komunikat „not found”, moĔe to oznaczaè, Ĕe powäoka
nie wystöpuje w systemie. Wtedy trzeba siö zwróciè do administratora systemu albo innego
doĈwiadczonego uĔytkownika. Istnieje jeszcze szansa, Ĕe jakaĈ wersja powäoki bash jest zainstalowana w takim miejscu w systemie (katalogu), które nie jest dostöpne dla bieĔñcego uĔytkownika. JeĈli nie, naleĔy przejĈè do rozdziaäu 11. i sprawdziè, w jaki sposób moĔna pobraè
powäokö bash.
Gdy bödzie juĔ pewne, Ĕe powäoka bash jest dostöpna w systemie, moĔna jñ wywoäaè z poziomu dowolnej innej powäoki, tak jak poprzednio wpisujñc polecenie bash. Znacznie lepiej jednak jest zainstalowaè jñ jako powäokö logowania, to znaczy jako powäokö udostöpnianñ automatycznie w momencie zalogowania siö. W tym celu moĔe byè konieczne samodzielne
przeprowadzenie instalacji. PoniĔej znajdujñ siö instrukcje, które powinny okazaè siö skuteczne
w niemal wszystkich systemach Unix. JeĔeli coĈ pójdzie nie tak (na przykäad po wpisaniu jakiegoĈ polecenia w odpowiedzi pojawi siö komunikat bäödu „not found” lub pusty wiersz),
trzeba bödzie przerwaè proces i zwróciè siö do administratora systemu. MoĔna teĔ zajrzeè do
rozdziaäu 12., w którym prezentowany jest nieco bardziej skomplikowany sposób zastöpowania
bieĔñcej powäoki.
Uaktywnianie powĥoki bash
_
19
Najpierw trzeba ustaliè, gdzie w systemie znajduje siö powäoka, to znaczy w którym katalogu
jñ zainstalowano. W znalezieniu odpowiedniej lokalizacji pomocne moĔe okazaè siö polecenie
whereis bash (dotyczy to zwäaszcza powäoki C); jeĈli jednak to rozwiñzanie siö nie sprawdzi, moĔna wypróbowaè polecenia whence bash, which bash albo wpisaè bardziej zäoĔone
polecenie3:
grep bash /etc/passwd | awk -F: '{print $7}' | sort -u
Zwrócona odpowiedĒ powinna mieè postaè takñ jak /bin/bash albo /usr/local/bin/bash.
Aby ustawiè powäokö bash jako powäokö logowania, naleĔy wpisaè polecenie chsh nazwa_
powĪoki, gdzie nazwa_powĪoki powinna zostaè zastñpiona odpowiedziñ wygenerowanñ przez
polecenie whereis (albo inne, które okazaäo siö skuteczne). Na przykäad:
% chsh /usr/local/bin/bash
W odpowiedzi zwrócony zostanie komunikat o bäödzie informujñcy, Ĕe powäoka jest nieprawidäowa, albo uĔytkownik zostanie poproszony o podanie hasäa4. NaleĔy wówczas wpisaè hasäo,
po czym wylogowaè siö i zalogowaè ponownie, by móc zaczñè korzystaè z bash.
Interaktywna praca z powĥoké
Interaktywna praca z powäokñ odbywa siö w trakcie sesji logowania, rozpoczynajñcej siö w chwili
zalogowania i koþczñcej w momencie wpisania polecenia exit lub logout albo naciĈniöcia
CTRL+D5. W trakcie sesji logowania wpisuje siö wiersze poleceþ przeznaczonych dla powäoki. Sñ to wiersze tekstu zakoþczone naciĈniöciem klawisza RETURN, wpisywane na terminalu
lub stacji roboczej.
DomyĈlnie symbol zachöty prezentowany przez powäokö dla kolejnych poleceþ ma postaè
informacji zakoþczonej znakiem dolara. Jak siö jednak przekonamy w trakcie lektury rozdziaäu
3., caäy symbol zachöty moĔna zmieniè.
Polecenia, argumenty i opcje
Wiersze poleceþ powäoki skäadajñ siö z jednego lub wiöcej säów oddzielonych spacjami lub znakami tabulacji. Pierwsze säowo w wierszu to polecenie, a pozostaäe (jeĔeli wystöpujñ) stanowiñ
argumenty (nazywane równieĔ parametrami) tego polecenia, bödñce nazwami elementów, na
które polecenie ma dziaäaè.
Na przykäad wiersz polecenia lp mójplik skäada siö z polecenia lp (drukowanie pliku) i pojedynczego argumentu mójplik. Polecenie lp traktuje mójplik jako nazwö pliku, którego zawartoĈè ma byè wydrukowana. Czösto argumentami sñ wäaĈnie nazwy pliku, jednak nie zawsze.
Na przykäad w wierszu polecenia mail cam program mail potraktuje argument cam jako nazwö uĔytkownika, do którego ma zostaè wysäany komunikat.
3
NaleĔy siö upewniè, Ĕe w poleceniu tym zostanie zastosowany odpowiedni apostrof: ' zamiast `.
4
Z uwagi na bezpieczeþstwo systemu tylko niektóre programy moĔna instalowaè jako powäoki logowania.
5
Powäokö moĔna skonfigurowaè w taki sposób, aby ignorowaäa pojedyncze naciĈniöcie klawiszy CTRL+D, nie
koþczñc sesji. Zalecamy stosowanie takiego rozwiñzania, poniewaĔ CTRL+D czösto jest naciskany przypadkowo. Wiöcej informacji na ten temat znajduje siö w rozdziale 3., w punkcie dotyczñcym opcji.
20
_
Rozdziaĥ 1. Podstawy powĥoki bash
Opcja to specjalny typ argumentu, który stanowi dla polecenia informacjö, jaka czynnoĈè ma
zostaè wykonana. Opcje zwykle skäadajñ siö z myĈlnika i litery. Mówimy „zwykle”, poniewaĔ
jest to raczej konwencja, a nie reguäa, od której nie ma odstöpstwa. Polecenie lp -h mójplik
zawiera opcjö -h, która zakazuje poleceniu lp drukowania „strony tytuäowej” przed wydrukowaniem zawartoĈci pliku.
Czasami opcje przyjmujñ wäasne argumenty. Na przykäad polecenie lp -d lp1 -h mójplik
zawiera dwie opcje i jeden argument. Pierwszñ opcjñ jest -d lp1, co oznacza „przeĈlij dane
wynikowe do urzñdzenia lp1”. Druga opcja oraz argument sñ takie same jak w poprzednim
przykäadzie.
Pliki
Argumentami poleceþ nie zawsze sñ pliki, lecz to wäaĈnie pliki sñ najwaĔniejszym elementem
kaĔdego systemu Unix. Plik moĔe zawieraè dowolny rodzaj informacji, poza tym pliki wystöpujñ w róĔnych odmianach. NajwaĔniejsze sñ nastöpujñce trzy rodzaje plików:
Zwykäe pliki
Nazywane równieĔ plikami tekstowymi, poniewaĔ zawierajñ czytelne znaki. Na przykäad
niniejsza ksiñĔka powstaäa z kilku zwykäych plików zawierajñcych tekst oraz czytelne dla
czäowieka instrukcje formatujñce, przeznaczone dla edytora tekstu troff.
Pliki wykonywalne
Nazywane równieĔ programami, sñ wywoäane w postaci poleceþ. Niektóre z nich sñ nieczytelne dla czäowieka, inne natomiast — skrypty powäoki, którymi bödziemy zajmowaè
siö w dalszej czöĈci ksiñĔki — to specjalne pliki tekstowe. Sama powäoka jest nieczytelnym
dla czäowieka plikiem wykonywalnym o nazwie bash.
Katalogi
Sñ one czymĈ w rodzaju folderów zawierajñcych pliki, w tym równieĔ inne katalogi (zwane
podkatalogami).
Katalogi
W niniejszym punkcie zostanñ opisane najwaĔniejsze zagadnienia dotyczñce katalogów. Katalogi mogñ zawieraè inne katalogi, co prowadzi do powstania hierarchicznej struktury wszystkich plików systemu Unix, zwanej równieĔ drzewem.
Na rysunku 1.2 przedstawiono fragment standardowego drzewa katalogów. Prostokñty symbolizujñ katalogi, a elementy owalne to zwykäe pliki.
Szczyt drzewa to katalog gäówny, root, który nie ma nazwy w systemie6. Wszystkie pliki moĔna zidentyfikowaè za pomocñ nazwy okreĈlajñcej ich lokalizacjö wzglödem katalogu gäównego. Nazwy takie powstajñ poprzez wskazanie nazw wszystkich katalogów (kolejno, poczñwszy od katalogu gäównego), oddzielonych od siebie znakiem ukoĈnika (/), i sñ zakoþczone
nazwñ samego pliku. Tak skonstruowana nazwa to tak zwana peäna (albo bezwzglödna) ĈcieĔka dostöpu.
6
WiökszoĈè samouczków Uniksa podaje, Ĕe nazwñ katalogu root jest /. Pozostaniemy jednak przy naszym stwierdzeniu o braku nazwy, poniewaĔ jest ono pod wzglödem logicznym bardziej spójne z innymi konwencjami
nazywania plików w Uniksie.
Pliki
_
21
Rysunek 1.2. Drzewo katalogów i plików
ZaäóĔmy na przykäad, Ĕe istnieje plik awkc znajdujñcy siö w katalogu ksiñĔka, ten zaĈ znajduje
siö w katalogu cam naleĔñcym do katalogu home, z kolei ten znajduje siö w katalogu gäównym.
Peänñ ĈcieĔkñ dostöpu do tego pliku bödzie zatem /home/cam/ksiñĔka/awkc.
Katalog roboczy
OczywiĈcie, koniecznoĈè wskazywania za kaĔdym razem peänych ĈcieĔek dostöpu do pliku
byäaby irytujñca. Na szczöĈcie istnieje tak zwany katalog roboczy (nazywany czasami katalogiem
bieĔñcym) — katalog, w którym „jest siö” w danym momencie. JeĔeli ĈcieĔka dostöpu nie bödzie rozpoczynaè siö znakiem ukoĈnika, wówczas lokalizacja pliku zostanie ustalona wzglödem katalogu roboczego. Tak skonstruowane nazwy to tak zwane wzglödne ĈcieĔki dostöpu,
wykorzystywane znacznie czöĈciej niĔ peäne ĈcieĔki dostöpu.
Po zalogowaniu siö do systemu katalogiem roboczym staje siö specjalny katalog zwany katalogiem domowym (lub logowania). Administratorzy systemu czösto konfigurujñ go w taki
sposób, aby nazwa katalogu domowego kaĔdego uĔytkownika byäa taka sama jak nazwa tego
uĔytkownika i aby wszystkie katalogi domowe znajdowaäy siö we wspólnym katalogu bödñcym podkatalogiem katalogu gäównego.
Na przykäad typowym katalogiem domowym jest /home/cam. JeĔeli bödzie on jednoczeĈnie katalogiem roboczym i wpisane zostanie polecenie lp notes, wówczas system poszuka pliku notes
w katalogu /home/cam. JeĔeli w tym katalogu domowym znajduje siö katalog o nazwie kapelusznik zawierajñcy plik o nazwie herbatka, wówczas zawartoĈè pliku moĔna wydrukowaè poleceniem lp kapelusznik/herbatka.
22
_
Rozdziaĥ 1. Podstawy powĥoki bash
Zapis ze znakiem tyldy
Nietrudno siö domyĈliè, Ĕe katalogi domowe czösto wystöpujñ w ĈcieĔkach dostöpu. Wprawdzie wiökszoĈè systemów jest tak zorganizowana, aby wszystkie katalogi domowe miaäy wspólnego rodzica (na przykäad /home albo /users), lecz nie moĔna za kaĔdym razem przyjmowaè takiego zaäoĔenia ani nawet nie powinna istnieè koniecznoĈè wskazywania bezwzglödnej ĈcieĔki
dostöpu do czyjegoĈ katalogu domowego.
Z tego powodu powäoka bash pozwala na stosowanie skrótowej nazwy katalogów domowych
— w tym celu wystarczy poprzedziè nazwö uĔytkownika znakiem tyldy (~). MoĔna wiöc na
przykäad odwoäywaè siö do pliku ksiñĔka znajdujñcego siö w katalogu domowym uĔytkownika
o nazwie alicja, stosujñc zapis ~alicja/ksiñĔka. Jest to bezwzglödna ĈcieĔka dostöpu, dlatego
nie ma znaczenia rzeczywista nazwa katalogu domowego. JeĔeli katalog domowy uĔytkownika
alicja zawiera podkatalog o nazwie przygoda i to wäaĈnie w nim znajduje siö plik, wówczas jako ĈcieĔkö dostöpu moĔna podaè ~alicja/przygoda/bajka.
Jeszcze wiökszñ wygodö zapewnia to, Ĕe tylda sama odwoäuje siö do katalogu domowego uĔytkownika. Do pliku o nazwie notes znajdujñcego siö w katalogu domowym moĔna siö odwoäaè, wpisujñc ~/notes (zwróèmy uwagö na róĔnicö miödzy tym zapisem a zapisem ~notes,
który zostaäby zinterpretowany przez powäokö jako katalog domowy uĔytkownika o nazwie
notes). JeĈli notes znajduje siö w podkatalogu przygoda, wówczas moĔna go wywoäywaè
jako ~/przygoda/notes. Zapis taki jest przydatny w sytuacji, gdy katalog roboczy nie znajduje
siö w drzewie katalogu domowego, to znaczy gdy jest nim na przykäad jakiĈ katalog systemowy, na przykäad /tmp.
Zmiana katalogów roboczych
Aby zmieniè katalog roboczy, naleĔy uĔyè polecenia cd. JeĔeli uĔytkownik zapomni nazwy
aktualnego katalogu roboczego, system wyĈwietli go po wpisaniu polecenia pwd.
Argumentem polecenia cd jest nazwa katalogu, który ma staè siö katalogiem roboczym. MoĔe to byè katalog wzglödny wobec katalogu bieĔñcego, moĔe zawieraè tyldö albo byè okreĈlony ĈcieĔkñ bezwzglödnñ (rozpoczynajñcñ siö od znaku ukoĈnika). JeĔeli argument zostanie
pominiöty, cd katalogiem roboczym ustanowi katalog domowy (to znaczy jego dziaäanie bödzie
takie samo jak dziaäanie polecenia cd ~).
W tabeli 1.1 przedstawiono przykäadowe polecenia cd. W przypadku kaĔdego z nich przyjöto
zaäoĔenie, Ĕe katalogiem roboczym jest /home/cam i Ĕe struktura katalogu jest taka sama jak na
rysunku 1.2.
Tabela 1.1. Przykäadowe polecenia cd
Polecenie
Nowy katalog roboczy
cd ksiîška
/home/cam/ksiéŜka
cd ksiîška/krainaczarów
/home/cam/ksiéŜka/krainaczarów
cd ~/ksiîška/krainaczarów
/home/cam/ksiéŜka/krainaczarów
cd /usr/lib
/usr/lib/
cd ..
/home
cd ../gryf
/home/gryf
cd ~gryf
/home/gryf
Pliki
_
23
Pierwsze cztery polecenia majñ prostñ konstrukcjö. W dalszych dwóch uĔyto specjalnego katalogu o nazwie .. (dwie kropki), który oznacza rodzica bieĔñcego katalogu. Istnieje on dla kaĔdego katalogu, a zapis ten jest standardowym sposobem przechodzenia do katalogu znajdujñcego
siö w hierarchii katalogów nad katalogiem bieĔñcym, czyli do tak zwanego katalogu rodzica7.
Kolejnñ ciekawñ odmianñ polecenia cd powäoki bash jest cd -, powodujñce przejĈcie do katalogu, który byä katalogiem bieĔñcym przed przejĈciem do obecnego katalogu bieĔñcego. Na przykäad, jeĔeli najpierw katalogiem bieĔñcym bödzie /usr/lib, nastöpnie wpisane zostanie polecenie cd bez argumentu, powodujñce przejĈcie do katalogu domowego, po czym zostanie wydane
polecenie cd -, wówczas uĔytkownik zostanie przeniesiony z powrotem do katalogu /usr/lib.
Rozwijanie symbolami wieloznacznymi
nazw plików i ļcieŜek dostýpu
Czasami istnieje potrzeba uruchomienia polecenia jednoczeĈnie na wiöcej niĔ jednym pliku.
Najprostszym przykäadem takiego polecenia jest ls, prezentujñce listö informacji na temat plików. W najprostszej postaci — to znaczy bez opcji i argumentów — polecenie to wypisuje nazwy wszystkich plików znajdujñcych siö w katalogu roboczym oprócz specjalnych plików
ukrytych, których nazwy zaczynajñ siö znakiem kropki (.).
JeĔeli w poleceniu ls podane zostanñ argumenty w postaci nazw plików, wówczas zostanñ
wyĈwietlone informacje o wskazanych plikach. Takie dziaäanie nie ma jednak wiökszego sensu,
jeĈli bowiem w katalogu bieĔñcym znajdujñ siö pliki ksiöĔna i królowa i zostanie wpisane polecenie ls ksiĂšna królowa, wówczas system po prostu zwróci nazwy tych plików.
Tak naprawdö ls stosuje siö czöĈciej wraz z opcjami wskazujñcymi, jakie informacje majñ byè
wyĈwietlone. Na przykäad opcja -l (long) nakazuje poleceniu ls wypisanie wäaĈciciela pliku,
jego rozmiaru, czasu ostatniej modyfikacji oraz innych informacji, zaĈ opcja -a (all) powoduje wypisanie równieĔ wczeĈniej wspomnianych plików ukrytych. Czasami jednak trzeba
sprawdziè istnienie okreĈlonej grupy plików, gdy nie zna siö nazw ich wszystkich — na przykäad, jeĈli uĔywany jest edytor tekstu, konieczne moĔe byè sprawdzenie, które pliki koþczñ
siö literami .txt.
Nazwy plików sñ w Uniksie na tyle istotne, Ĕe powäoka udostöpnia wbudowany mechanizm
pozwalajñcy zdefiniowaè wzorzec zbioru nazw plików bez koniecznoĈci podawania ich konkretnych nazw. W tym celu w nazwach plików stosuje siö specjalne znaki, tak zwane symbole
wieloznaczne, säuĔñce do definiowania wzorców nazw plików. W tabeli 1.2 wymieniono podstawowe symbole wieloznaczne.
Symbol wieloznaczny ? oznacza dowolny pojedynczy znak, dlatego jeĈli katalog zawiera pliki
program.c, program.log i program.o, wówczas wyraĔenie program.? bödzie pasowaäo do program.c
i program.o, ale juĔ nie do program.log.
7
KaĔdy katalog zawiera równieĔ specjalny katalog . (jedna kropka), oznaczajñcy po prostu „ten katalog”. Zatem
polecenie cd . nie da tak naprawdö Ĕadnego efektu. Katalogi . i .. sñ w istocie specjalnymi plikami ukrytymi
obecnymi w kaĔdym katalogu, które wskazujñ odpowiednio na sam katalog oraz katalog rodzica. Katalog
gäówny jest jednoczeĈnie swoim wäasnym rodzicem.
24
_
Rozdziaĥ 1. Podstawy powĥoki bash
Tabela 1.2. Podstawowe symbole wieloznaczne
Symbol wieloznaczny
Oznacza
?
Dowolny pojedynczy znak.
*
Dowolny ciîg znaków.
[zbiór]
Dowolny znak w zbiorze.
[!zbiór]
Dowolny znak, który nie znajduje siý w zbiorze.
Znak gwiazdki (*) daje wiöksze moĔliwoĈci i dlatego jest uĔywany znacznie czöĈciej. Symbolizuje on dowolny ciñg znaków. WyraĔenie program.* bödzie pasowaè do wszystkich trzech
plików wspomnianych w poprzednim akapicie. UĔytkownicy edytora tekstu mogñ wiöc wykorzystaè wyraĔenie *.txt do odnalezienia plików wejĈciowych8.
Tabela 1.3 ilustruje dziaäanie symbolu gwiazdki. ZaäóĔmy, Ĕe w katalogu roboczym znajdujñ
siö pliki o nazwach robert, daniel, dawid, ed, franek i fred.
Tabela 1.3. Stosowanie symbolu wieloznacznego WyraŜenie
Pasuje do
fr*
franek fred
*ed
ed fred
r*
robert
*e*
robert daniel ed franek fred
*r*
robert franek fred
*
robert daniel dawid ed franek fred
d*l
daniel
g*
g
ZauwaĔmy, Ĕe symbol * pasuje równieĔ do znaku nieistniejñcego: wyraĔenia *ed i *e* pasujñ
do nazwy pliku ed. Zwróèmy równieĔ uwagö na ostatni przykäad, ilustrujñcy reakcjö powäoki,
gdy nie zostanñ odnalezione Ĕadne pasujñce nazwy: zwracane jest wówczas podane wyraĔenie
w niezmienionej postaci.
Ostatni symbol wieloznaczny to zbiór. Zbiór jest listñ znaków (np. abc), zakresem (np. a – z)
albo poäñczeniem obu. JeĔeli czöĈciñ listy ma byè myĈlnik, trzeba go wpisaè jako pierwszy lub
ostatni znak zbioru. Tabela 1.4 powinna rozjaĈniè dziaäanie tego symbolu wieloznacznego.
Pozostajñc przy poczñtkowym przykäadzie stosowania symboli wieloznacznych — wyraĔenia
program.[co] i program.[a-z] bödñ pasowaè do nazw plików program.c i program.o, ale juĔ
nie do program.log.
8
UĔytkownicy systemów MS-DOS i VAX/VMS powinni zwróciè uwagö, Ĕe znak kropki (.) w nazwach plików Uniksa nie jest niczym specjalnym (nie liczñc kropki wystöpujñcej na poczñtku, która powoduje „ukrycie”
pliku) — jest to po prostu jeden z dostöpnych znaków. Na przykäad polecenie ls * spowoduje wyĈwietlenie
wszystkich plików znajdujñcych siö w bieĔñcym katalogu, nie trzeba wiöc stosowaè zapisu *.*, jak w innych
systemach. Tak naprawdö ls *.* nie wyĈwietli wszystkich plików, a jedynie te, których nazwa zawiera
w Ĉrodku co najmniej jeden znak kropki.
Pliki
_
25
Tabela 1.4. Stosowanie symbolu wieloznacznego w postaci zbioru
WyraŜenie
Oznacza
[abc]
a, b lub c.
[.,;]
Kropka, przecinek lub ļrednik.
[-_]
Myļlnik lub podkreļlenie.
[a-c]
a, b lub c.
[a-z]
Wszystkie maĥe litery.
[!0-9]
Wszystkie znaki, które nie sé cyframi.
[0-9!]
Wszystkie cyfry i znak wykrzyknika.
[a-zA-Z]
Wszystkie maĥe i wielkie litery.
[a-zA-Z0-9_-]
Wszystkie litery, wszystkie cyfry, podkreļlenie i myļlnik.
Znak wykrzyknika znajdujñcy siö za otwierajñcym nawiasem pozwala „zanegowaè” zbiór. Na
przykäad zapis [!.;] pasuje do kaĔdego znaku oprócz kropki i Ĉrednika, a [!a-zA-Z] pasuje
do wszystkich znaków, które nie sñ literami. Aby znaleĒè dopasowanie do samego znaku !,
naleĔy umieĈciè go po pierwszym znaku zbioru albo poprzedziè lewym ukoĈnikiem, na przykäad [\!].
Bardzo uĔytecznym rozwiñzaniem sñ zakresy, lecz nie naleĔy czyniè zbyt daleko idñcych zaäoĔeþ w odniesieniu do znaków wchodzñcych w skäad zakresu. Bezpiecznie jest uĔywaè zakresu
wielkich liter, maäych liter, cyfr oraz ich dowolnych podzakresów (na przykäad [f-q], [2-6]).
Nie naleĔy natomiast uĔywaè zakresów dla znaków interpunkcyjnych albo liter o róĔnej wielkoĈci. Na przykäad nie moĔna zakäadaè, Ĕe w zakresach [a-Z] i [A-z] znajdujñ siö wyäñcznie
litery i nic wiöcej. Problem polega na tym, Ĕe tego rodzaju zakresy nie sñ przenoĈne miödzy
róĔnymi typami komputerów9.
Proces dopasowywania wyraĔeþ zawierajñcych symbole wieloznaczne to tak zwane rozwijanie symbolami wieloznacznymi albo rozwijanie i uogólnianie. Jest to tylko jeden z kilku
kroków wykonywanych przez powäokö w trakcie odczytywania i przetwarzania wiersza poleceþ. Kolejnym krokiem (wspomnianym wczeĈniej) jest rozwijanie znakiem tyldy, w którym
tyldy sñ zastöpowane nazwami katalogów domowych. Inne kroki poznamy w dalszych rozdziaäach, a szczegóäowy opis tego mechanizmu znalazä siö w rozdziale 7.
NaleĔy jednak pamiötaè, Ĕe wykonywane polecenia wykorzystujñ jedynie wyniki rozwijania
symbolami wieloznacznymi. Innymi säowy, widzñ one jedynie listö argumentów, natomiast
nie ma dla nich znaczenia, w jaki sposób te argumenty powstaäy. Na przykäad, jeĈli zostanie
wpisane polecenie ls fr* i bödñ istnieè pliki wymienione na poprzedniej stronie, wówczas
powäoka rozwinie wiersz poleceþ do postaci ls fred franek i wywoäa polecenie ls z argumentami fred i franek. JeĈli wpisane zostanie polecenie ls g*, wówczas polecenie ls zostanie
wykonane (poniewaĔ nie zostanñ znalezione pliki o pasujñcej nazwie) z niezmienionym ciñgiem znaków g* i zwróci komunikat o bäödzie g*: Nie ma takiego pliku ani katalogu10.
9
Mówiñc precyzyjnie, zakresy zaleĔñ od schematu kodowania znaków uĔywanego przez komputer (zwykle jest
to ASCII, lecz na przykäad komputery mainframe firmy IBM uĔywajñ schematu EBCDIC) oraz zestawu znaków wyznaczanego przez bieĔñce ustawienia regionalne (zakresy w jözykach innych niĔ angielski mogñ powodowaè generowanie innych wyników).
10
RóĔni siö to od dziaäania symboli wieloznacznych w powäoce C, która od razu wyĈwietli komunikat o bäödzie
i w ogóle nie wykona polecenia.
26
_
Rozdziaĥ 1. Podstawy powĥoki bash
RozwaĔmy przykäad, który powinien rozjaĈniè omawiane zagadnienie. ZaäóĔmy, Ĕe jesteĈmy
programistami C. Oznacza to, Ĕe pracujemy na plikach, których nazwy koþczñ siö znakami .c
(sñ to programy, zwane równieĔ plikami Ēródäowymi), .h (pliki nagäówków programów) i .o
(pliki kodu obiektowego, nieczytelne dla czäowieka), a takĔe mamy do czynienia z innymi plikami. Powiedzmy, Ĕe chcemy uzyskaè listö wszystkich plików Ēródäowych, kodu obiektowego i nagäówków znajdujñcych siö w katalogu roboczym. SäuĔy do tego polecenie ls *.[cho].
Powäoka rozwinie symbol *.[cho] do nazw wszystkich plików, których nazwy koþczñ siö
znakiem kropki i literñ c, h lub o, po czym przekaĔe tak ustalonñ listö jako argumenty polecenia ls. Inaczej mówiñc, polecenie ls zostanie wykonane z nazwami plików tak, jakby wszystkie te nazwy zostaäy wpisane röcznie jedna po drugiej. Zwróèmy uwagö, Ĕe w ogóle nie musieliĈmy znaè rzeczywistych nazw tych plików! Caäñ pracö wykonaä za nas symbol wieloznaczny.
Analizowany dotñd przykäad z symbolami wieloznacznymi jest tak naprawdö jedynie czöĈciñ
bardziej ogólnego zagadnienia pod tytuäem rozwijanie ĈcieĔek dostöpu. Symbole wieloznaczne moĔna stosowaè w katalogu roboczym, mogñ one takĔe stanowiè czöĈè ĈcieĔki dostöpu. Na
przykäad, aby uzyskaè listö wszystkich plików znajdujñcych siö w katalogach /usr i /usr2, moĔna wpisaè polecenie ls /usr*. JeĈli bödñ nas interesowaè jedynie pliki z tych katalogów, których
nazwa rozpoczyna siö na literö b lub e, wówczas ich listö zwróci polecenie ls /usr*/[be]*.
Rozwijanie nawiasami klamrowymi
Zagadnieniem ĈciĈle zwiñzanym z rozwijaniem ĈcieĔek dostöpu jest rozwijanie nawiasami klamrowymi. Symbole wieloznaczne w ĈcieĔkach dostöpu zostanñ rozwiniöte do nazw plików i katalogów, które istniejñ, natomiast rozwijanie nawiasami klamrowymi prowadzi do utworzenia
okreĈlonego ciñgu znaków w konkretnej postaci, to znaczy zawierajñcego opcjonalny wstöp,
nastöpnie umieszczone w nawiasach klamrowych ciñgi znaków oddzielone od siebie znakiem przecinka i opcjonalne zakoþczenie. JeĔeli na przykäad zostanie wpisane polecenie
echo b{ra,ere,ru}k, wówczas wyĈwietlone zostanñ säowa brak, berek i bruk. KaĔdy ciñg
znaków znajdujñcy siö w nawiasach klamrowych jest äñczony ze wstöpem b oraz zakoþczeniem k. Co waĔne, nie sñ to wcale nazwy plików — wygenerowane w ten sposób ciñgi znaków nie zaleĔñ od nazw istniejñcych plików. Nawiasy klamrowe moĔna dodatkowo zagnieĔdĔaè, jak na przykäad w wyraĔeniu b{ar{a,e},ru}k. Zostanie ono rozwiniöte do säów barak,
barek i bruk.
Nieco inny rodzaj rozwijania nawiasami klamrowymi moĔna zastosowaè w celu utworzenia
sekwencji liter lub liczb. JeĔeli na przykäad wpisane zostanie polecenie echo {2..5}, wyraĔenie zostanie rozwiniöte do ciñgu 2 3 4 5. Z kolei polecenie echo {d..h} wygeneruje ciñg
11
d e f g h .
Rozwijanie nawiasami klamrowymi moĔna stosowaè äñcznie z rozwijaniem symbolami wieloznacznymi. W przykäadzie z poprzedniego punktu, w którym byäa wyĈwietlana lista plików
Ēródäowych, nagäówków i kodu obiektowego znajdujñcych siö w katalogu roboczym, moĔna
byäo uĔyè polecenia ls *.{c,h,o}12.
11
Taka postaè rozwijania nawiasami klamrowymi nie jest dostöpna w wersjach powäoki bash niĔszych niĔ 3.0.
12
RóĔni siö to nieco od rozwijania nawiasami klamrowymi w powäoce C. Powäoka bash wymaga, aby w nawiasie
obecny byä co najmniej jeden znak przecinka, który nie bödzie objöty cudzysäowami. W przeciwnym razie caäe
säowo pozostanie niezmienione, to znaczy wyraĔenie b{a}rk po rozwiniöciu nadal bödzie miaäo postaè b{a}rk.
Pliki
_
27
Operacje wejļcia-wyjļcia
Informatyka — a tak naprawdö kaĔda dziedzina nauki — przeĔywa najwiökszy rozkwit wówczas, gdy ktoĈ (nie instytucja) wpadnie na bardzo prosty pomysä, który bödzie miaä jednak
rozlegäe skutki. Na krótkiej liĈcie takich pomysäów niewñtpliwie znalazäby siö schemat operacji
wejĈcia-wyjĈcia systemu Unix, a takĔe klasyczne juĔ wynalazki takie jak jözyk LISP, relacyjny
model danych i programowanie zorientowane obiektowo.
Schemat wejĈcia-wyjĈcia systemu Unix opiera siö na dwóch zaskakujñco prostych pomysäach.
Po pierwsze, plikowe wejĈcie-wyjĈcie w Uniksie ma postaè sekwencji znaków o odpowiedniej
däugoĈci (iloĈci bajtów). Schematy wejĈcia-wyjĈcia w starszych systemach sñ bardziej skomplikowane (majñ na przykäad postaè „bloków”, „rekordów”, „kart” itp.). Po drugie, wszystkie elementy systemu, które generujñ lub przyjmujñ dane, sñ traktowane jak pliki. Dotyczy to równieĔ urzñdzeþ sprzötowych, takich jak napödy dyskowe i terminale. W starszych systemach
kaĔde takie urzñdzenie jest traktowane odmiennie. Obydwa pomysäy znacznie uäatwiäy Ĕycie
programistom systemowym.
Standardowe operacje wejļcia-wyjļcia
Konwencja stanowi, Ĕe kaĔdy program Uniksa zawiera pojedynczy mechanizm przyjmowania danych wejĈciowych zwany standardowym wejĈciem, pojedynczy mechanizm generowania danych wyjĈciowych zwany standardowym wyjĈciem oraz pojedynczy mechanizm
generowania komunikatów o bäödzie zwany standardowym wyjĈciem bäödów. OczywiĈcie
kaĔdy program moĔe mieè takĔe inne Ēródäa danych wejĈciowych i wyjĈciowych, o czym
przekonamy siö w trakcie lektury rozdziaäu 7.
Standardowe operacje wejĈcia-wyjĈcia stanowiäy pierwszy tego rodzaju schemat zaprojektowany z myĈlñ o uĔytkownikach interaktywnych, korzystajñcych z terminali, czyli rozwiñzania
odmiennego od stylu wsadowego polegajñcego zwykle na uĔywaniu kart perforowanych. Powäoka Uniksa zazwyczaj udostöpnia interfejs uĔytkownika, dlatego w naturalny sposób standardowe operacje wejĈcia-wyjĈcia skonstruowano tak, aby pasowaäy do sposobu dziaäania powäoki.
Zasadniczo wszystkie powäoki wykonujñ operacje wejĈcia-wyjĈcia w taki sam sposób. KaĔdy
wywoäywany program ma trzy standardowe kanaäy wejĈcia-wyjĈcia skonfigurowane do pracy z terminalem lub stacjñ roboczñ, a zatem standardowym wejĈciem jest klawiatura, a standardowym wyjĈciem oraz wyjĈciem bäödów jest ekran lub okno. Na przykäad narzödzie mail
wyĈwietla wiadomoĈci na standardowym wyjĈciu, a jeĔeli zostanie uĔyte do wysyäania wiadomoĈci do innych uĔytkowników, wówczas narzödzie pobierze dane wejĈciowe ze standardowego wejĈcia. Oznacza to, Ĕe otrzymane wiadomoĈci przeglñda siö na ekranie, a nowe wiadomoĈci wpisuje przy uĔyciu klawiatury.
W razie potrzeby moĔna przekierowaè wejĈcie i wyjĈcie tak, aby pochodziäy z pliku albo byäy
do niego wysyäane. JeĔeli na przykäad trzeba wysäaè zawartoĈè istniejñcego pliku w postaci
wiadomoĈci pocztowej, wówczas naleĔy przekierowaè standardowe wejĈcie programu mail
w taki sposób, aby odczytywaä on dane z tego pliku, a nie z klawiatury.
Programy moĔna równieĔ äñczyè w tak zwane potoki, w których standardowe wyjĈcie jednego programu stanowi jednoczeĈnie bezpoĈrednie standardowe wejĈcie dla innego programu.
Na przykäad wyjĈcie programu mail moĔna skierowaè jako wejĈcie do programu lp, dziöki czemu wiadomoĈci bödñ od razu drukowane, a nie wyĈwietlane na ekranie.
28
_
Rozdziaĥ 1. Podstawy powĥoki bash
Dziöki temu rozwiñzaniu narzödzi Uniksa moĔna uĔywaè w roli elementów skäadowych wiökszych programów. Wiele programów narzödziowych Uniksa tworzono wäaĈnie z myĈlñ o ich
wykorzystaniu w taki sposób — kaĔde z nich wykonuje okreĈlonñ operacjö przetwarzania tekstu wejĈciowego. Wprawdzie niniejsza ksiñĔka nie jest podröcznikiem z dziedziny programów
narzödziowych Uniksa, lecz majñ one zasadnicze znaczenie dla efektywnego wykorzystywania
powäoki. Najbardziej znane narzödzia przetwarzania potokowego wymieniono w tabeli 1.5.
Tabela 1.5. Popularne narzödzia Uniksa przetwarzajñce dane
Narzýdzie
Cel
cat
Kopiowanie wejļcia do wyjļcia.
grep
Wyszukiwanie ciégów znaków w danych wejļciowych.
sort
Sortowanie wierszy danych wejļciowych.
cut
Odczytywanie kolumn z danych wejļciowych.
sed
Wykonywanie operacji edycyjnych na danych wejļciowych.
tr
Zamienianie znaków znajdujécych siý w danych wejļciowych na inne znaki.
Czytelnicy, którzy juĔ uĔywali niektórych z wymienionych narzödzi, byè moĔe zauwaĔyli, Ĕe
ich argumentami sñ nazwy plików wejĈciowych, a dane wyjĈciowe sñ przesyäane do standardowego wyjĈcia. Nie wszyscy jednak wiedzñ, Ĕe w razie pominiöcia argumentu wszystkie te
narzödzia (tak samo zresztñ jak wiökszoĈè innych programów narzödziowych Uniksa) przyjmñ
dane wejĈciowe pochodzñce ze standardowego wejĈcia13.
Na przykäad podstawowym programem narzödziowym jest cat, który po prostu kopiuje dane
wejĈciowe do wyjĈcia. JeĔeli zostanie wpisane polecenie cat z nazwñ pliku jako argumentem,
na ekranie zostanie wyĈwietlona zawartoĈè tego pliku. JeĔeli natomiast polecenie zostanie wywoäane bez argumentów, program wykorzysta standardowe wejĈcie i skopiuje je do standardowego wyjĈcia. Zobaczmy, jak to dziaäa: cat bödzie czekaè na wpisanie wiersza tekstu przez
uĔytkownika; gdy naciĈniöty zostanie klawisz RETURN, cat zwróci uĔytkownikowi wpisany
tekst. Aby zatrzymaè ten proces, na poczñtku wiersza trzeba nacisnñè klawisze CTRL+D. Ich
naciĈniöcie spowoduje, Ĕe na ekranie pojawi siö symbol ^D. Oto efekt dziaäania programu cat:
$ cat
Oto wiersz tekstu.
Oto wiersz tekstu.
Oto kolejny wiersz tekstu.
Oto kolejny wiersz tekstu.
^D
$
Przekierowywanie wejļcia-wyjļcia
Nazwa cat to skrót säowa „catenate”, oznaczajñcego äñczenie. Argumentami tego polecenia
moĔe byè jedna lub wiöcej nazw plików, które majñ zostaè skopiowane do standardowego wyjĈcia. Na razie jednak zaäóĔmy, Ĕe cat i inne programy narzödziowe nie akceptujñ argumentów w postaci nazw plików, a jedynie standardowe wejĈcie. Jak juĔ wczeĈniej wspomniano,
13
JeĔeli w przypadku pominiöcia nazwy pliku jako argumentu któreĈ z narzödzi Uniksa nie zaakceptuje standardowego wejĈcia, moĔna spróbowaè zastosowaè jako argument znak myĈlnika (-). W niektórych systemach Unix
standardowe wejĈcie ma postaè pliku, zatem moĔna spróbowaè wskazaè plik /dev/stdin jako argument oznaczajñcy plik wejĈciowy.
Operacje wejļcia-wyjļcia
_
29
powäoka umoĔliwia przekierowywanie standardowego wejĈcia tak, aby pochodziäo z pliku.
SäuĔy do tego zapis polecenie < nazwa_pliku — dziöki niemu polecenie pobierze standardowe wejĈcie z pliku, a nie z terminala.
JeĔeli na przykäad istnieje plik o nazwie plik, który zawiera jakiĈ tekst, wówczas polecenie cat
< plik wyĈwietli zawartoĈè tego pliku na terminalu. Z kolei polecenie sort < plik posortuje wiersze znajdujñce siö w tym pliku i wyĈwietli wyniki sortowania na terminalu (pamiötajmy jednak: caäy czas zakäadamy, Ĕe programy narzödziowe nie akceptujñ nazw plików jako
argumentów).
Analogicznie polecenie > nazwa_pliku spowoduje, Ĕe standardowe wyjĈcie polecenia zostanie przekierowane do pliku o wskazanej nazwie. Klasycznym przykäadem jest polecenie date >
teraz: polecenie date wyĈwietli na standardowym wyjĈciu bieĔñcñ datö i godzinö. Wspomniane polecenie spowoduje zapisanie ich w pliku o nazwie teraz.
Przekierowywanie wejĈcia i wyjĈcia moĔna äñczyè. Na przykäad polecenie cp standardowo
säuĔy do kopiowania plików, jeĈli jednak z jakiegoĈ powodu polecenie to nie istnieje lub ulegäo uszkodzeniu, moĔna w jego miejsce zastosowaè polecenie cat. Robi siö to nastöpujñco:
$ cat < plik1 > plik2
Wynik tego polecenia bödzie podobny do wyniku polecenia cp plik1 plik2.
Potoki
Istnieje równieĔ moĔliwoĈè przekierowywania wyjĈcia polecenia do standardowego wejĈcia
innego polecenia zamiast do pliku. SäuĔy do tego konstrukcja zwana potok (pipe), oznaczana
znakiem |. Wiersz polecenia zawierajñcy dwa lub wiöcej poleceþ poäñczonych znakiem | jest
nazywany przetwarzaniem potokowym.
Potoku czösto uĔywa siö z poleceniem more, które dziaäa podobnie jak polecenie cat, z tñ róĔnicñ, Ĕe dane wynikowe sñ wyĈwietlane ekran po ekranie, a wyĈwietlanie kolejnych ekranów
jest wstrzymywane do czasu naciĈniöcia przez uĔytkownika klawisza spacji (nastöpny ekran),
klawisza RETURN (nastöpny wiersz) lub wpisania innych poleceþ. JeĔeli bieĔñcy katalog zawiera znacznñ liczbö plików i trzeba uzyskaè szczegóäowe informacje na ich temat, polecenie
ls -l | more spowoduje wyĈwietlenie poĔñdanych informacji w podziale na ekrany.
Potoki mogñ przybieraè bardzo zäoĔonñ postaè, mogñ byè równieĔ äñczone z przekierowywaniem wejĈcia-wyjĈcia. Aby wyĈwietliè posortowanñ zawartoĈè pliku plik w podziale na kolejne
ekrany, naleĔy wpisaè polecenie sort < plik | more. Natomiast aby wydrukowaè tö zawartoĈè zamiast prezentowaè jñ na ekranie, naleĔy wpisaè sort < plik | lp.
Spójrzmy na bardziej skomplikowany przykäad. W pliku /etc/passwd przechowywane sñ informacje na temat kont uĔytkowników systemu Unix. KaĔdy wiersz tego pliku zawiera nazwö
uĔytkownika, jego numer identyfikacyjny, zaszyfrowane hasäo, katalog domowy, powäokö logowania i inne dane. Pierwsze pole kaĔdego wiersza to nazwa uĔytkownika, a poszczególne pola
sñ oddzielane znakiem dwukropka (:). Przykäadowy wiersz moĔe mieè nastöpujñcñ postaè:
cam:LM1c7GhNesD4GhF3iEHrH4FFeCKB/:501:100:Cameron Newham:/home/cam:/bin/bash
Aby uzyskaè posortowanñ listö wszystkich uĔytkowników systemu, naleĔy wpisaè polecenie:
$ cut -d: -f1 < /etc/passwd | sort
30
_
Rozdziaĥ 1. Podstawy powĥoki bash
(Tak naprawdö znak < moĔna pominñè, poniewaĔ cut akceptuje argumenty w postaci nazw
plików wejĈciowych). Polecenie cut odczyta z wejĈcia pierwsze pole (-f1), przy czym pola te
sñ oddzielane dwukropkiem (-d:). Przedstawiony powyĔej potok wyĈwietli listö podobnñ do
poniĔszej:
adm
bin
cam
daemon
davidqc
ftp
games
gonzo
...
JeĔeli lista ma zostaè wysäana bezpoĈrednio na drukarkö zamiast na ekran, moĔna rozszerzyè
potok w nastöpujñcy sposób:
$ cut -d: -f1 < /etc/passwd | sort | lp
PowyĔszy przykäad powinien wyjaĈniè, w jaki sposób przekierowania wejĈcia-wyjĈcia i potoki wpisujñ siö w filozofiö elementów skäadowych w systemach Unix. Stosowany zapis jest niezwykle zwiözäy i daje ogromne moĔliwoĈci. Równie waĔne jest to, Ĕe mechanizm potoków
eliminuje koniecznoĈè posäugiwania siö plikami tymczasowymi, w których zapisywano by dane
wynikowe poleceþ, zanim zostanñ przekazane do innych poleceþ.
Na przykäad, aby uzyskaè taki sam efekt jak w wyniku wywoäania powyĔszego przetwarzania potokowego, w innych systemach operacyjnych trzeba wykonaè trzy polecenia (zakäadajñc
przy tym, Ĕe w systemach tych dostöpne sñ podobne programy narzödziowe). W systemie VAX/
VMS firmy DEC mogñ one mieè postaè:
$
$
$
$
cut [etc]passwd /d=":" /f=1 /out=temp1
sort temp1 /out=temp2
print temp2
delete temp1 temp2
Po jakimĈ czasie uĔytkownicy sñ w stanie bez problemu pisaè w jednym wierszu rozbudowane
potoki wykonujñce operacje, których wykonanie w innych systemach operacyjnych byäoby moĔliwe dopiero po uĔyciu kilku poleceþ (i plików tymczasowych).
Zadania drugoplanowe
Potoki sñ tak naprawdö specjalnym przypadkiem bardziej ogólnego mechanizmu, który polega na wykonywaniu wiöcej niĔ jednej czynnoĈci naraz. Jest to rozwiñzanie, które nie jest dostöpne w wielu innych komercyjnych systemach operacyjnych ze wzglödu na ograniczenia
nakäadane na uĔytkowników14. Unix natomiast zostaä opracowany w laboratorium naukowym
i poczñtkowo miaä pracowaè jedynie na jego potrzeby, dlatego nie ogranicza siö w nim zbytnio
dostöpu uĔytkowników do zasobów, dñĔñc do utrzymania prostoty zamiast zmuszaè do tworzenia skomplikowanych rozwiñzaþ.
14
Obecnie wszystkie popularne systemy operacyjne posiadajñ takñ moĔliwoĈè — przyp. täum.
Zadania drugoplanowe
_
31
„Wykonywanie wiöcej niĔ jednej czynnoĈci naraz” oznacza uruchamianie wiöcej niĔ jednego
programu w tym samym momencie. Tak wäaĈnie dzieje siö, gdy uĔywany jest potok. Z tym
samym efektem mamy do czynienia, jednoczeĈnie logujñc siö do systemu Unix kilka razy pod
rzñd bez wczeĈniejszego wylogowania. (Gdyby takñ operacjö wykonaè w systemie VM/CMS
firmy IBM, zostaäby wyĈwietlony komunikat „already logged in”).
Powäoka pozwala równieĔ wykonywaè wiöcej niĔ jedno polecenie naraz w trakcie pojedynczej sesji logowania. Gdy wpisywane jest polecenie i naciskany klawisz RETURN, zwykle powäoka przekazuje sterowanie terminalem temu poleceniu do momentu zakoþczenia jego wykonywania; wówczas nie moĔna wpisywaè kolejnych poleceþ, póki nie zakoþczy siö wykonywanie
wczeĈniejszego. JeĔeli natomiast trzeba uruchomiè polecenie, które nie wymaga danych wejĈciowych od uĔytkownika, i chcemy, aby w trakcie dziaäania tego polecenia wykonywane byäy
równieĔ inne czynnoĈci, naleĔy zakoþczyè polecenie znakiem ampersanda (&).
Jest to tak zwane uruchamianie polecenia w tle. Polecenie uruchomione w taki sposób okreĈlane jest jako zadanie drugoplanowe, natomiast zadanie uruchomione w sposób standardowy
nazywane jest zadaniem pierwszoplanowym. Gdy uruchomione zostanie zadanie drugoplanowe, symbol zachöty systemu operacyjnego pojawi siö od razu na ekranie i moĔliwe bödzie
wpisywanie kolejnych poleceþ.
Najbardziej oczywiste jest uruchamianie jako zadaþ drugoplanowych programów dziaäajñcych
przez däuĔszy czas, na przykäad wykonywanie operacji sort czy uncompress na duĔych plikach. ZaäóĔmy na przykäad, Ĕe wäaĈnie otrzymaliĈmy bardzo duĔy plik skompresowany, który
zostaä zaäadowany do katalogu z taĈmy magnetycznej15. Przyjmijmy, Ĕe plikiem tym jest gcc.tar.Z
— skompresowany plik archiwum zawierajñcy ponad 10 MB plików z kodem Ēródäowym.
NaleĔy wpisaè polecenie uncompress gcc.tar & (ostatni fragment, .Z, moĔna pominñè). System rozpocznie wówczas realizacjö zadania drugoplanowego, które „na miejscu” rozpakuje
dane i utworzy plik gcc.tar. Zaraz po wpisaniu wspomnianego polecenia na ekranie pojawi siö
wiersz podobny do przedstawionego poniĔej:
[1] 175
Po nim nastñpi znak zachöty powäoki, oznaczajñcy moĔliwoĈè wpisywania nastöpnych poleceþ.
Na podstawie wyĈwietlonych numerów moĔna odwoäywaè siö do zadania drugoplanowego
(szczegóäowe informacje na ten temat znajdujñ siö w rozdziale 8.).
Zadania drugoplanowe moĔna sprawdzaè poleceniem jobs. Dla kaĔdego zadania drugoplanowego jobs wyĈwietla wiersz podobny do powyĔszego, wskazujñc dodatkowo stan zadania:
[1]+ Running uncompress gcc.tar &
Gdy wykonywanie zadania zakoþczy siö, zaraz przed znakiem zachöty pojawi siö komunikat
podobny do poniĔszego:
[1]+ Done uncompress gcc.tar
TreĈè komunikatu bödzie inna, jeĈli zadanie drugoplanowe zakoþczy siö bäödem. Wiöcej na ten
temat równieĔ w rozdziale 8.
15
Pliki skompresowane sñ tworzone przez narzödzie compress (narzödzie to kompresuje pliki, aby zajmowaäy
mniej miejsca na dysku). Pliki takie noszñ nazwy w postaci nazwa.Z, gdzie nazwa oznacza nazwö oryginalnego,
nieskompresowanego pliku.
32
_
Rozdziaĥ 1. Podstawy powĥoki bash
Drugoplanowe operacje wejļcia-wyjļcia
Zadania uruchamiane w tle nie powinny wykonywaè operacji wejĈcia-wyjĈcia na terminalu.
Zastanówmy siö nad tym przez chwilö, a od razu bödzie wiadomo, dlaczego tak jest.
Zadanie drugoplanowe z definicji nie ma kontroli nad terminalem. Oznacza to miödzy innymi,
Ĕe na dane wejĈciowe z klawiatury oczekuje jedynie zadanie pierwszoplanowe (albo sama
powäoka, jeĔeli takiego zadania nie ma). JeĔeli zadanie drugoplanowe wymaga wpisania danych
wejĈciowych z klawiatury, czösto jego wykonywanie po prostu zostaje zawieszone aĔ do momentu podjöcia jakichĈ kroków (co zostaäo opisane w rozdziale 8.).
JeĔeli zadanie drugoplanowe wysyäa dane wyjĈciowe na ekran, dane te po prostu pojawiñ siö
na ekranie. JeĔeli jednoczeĈnie uruchomione jest zadanie pierwszoplanowe, które takĔe generuje dane wyjĈciowe, wówczas wyniki obydwu zadaþ bödñ siö przeplataè w sposób losowy
i czösto irytujñcy dla uĔytkownika.
JeĔeli w tle ma zostaè uruchomione zadanie oczekujñce standardowego wejĈcia lub generujñce standardowe wyjĈcie, zwykle wykonuje siö przekierowanie wejĈcia-wyjĈcia w taki sposób,
aby dane pochodziäy z pliku lub byäy do niego wysyäane. Programy, które tworzñ krótkie,
jednowierszowe komunikaty (ostrzeĔenia, komunikaty o zakoþczeniu pracy itd.), sñ wyjñtkiem
od tej reguäy, poniewaĔ zwykle uĔytkownik nie ma nic przeciwko temu, aby taki komunikat
znalazä siö miödzy pozostaäymi danymi wyjĈciowymi.
Na przykäad narzödzie diff analizuje dwa pliki, których nazwy stanowiñ argumenty polecenia,
a nastöpnie w standardowym wyjĈciu prezentuje podsumowanie róĔnic miödzy nimi. JeĔeli pliki
okaĔñ siö identyczne, diff nie zwróci Ĕadnych wyników. Zwykle jednak polecenie diff uruchamia siö wówczas, gdy istnieje koniecznoĈè odnalezienia wierszy róĔniñcych siö od siebie.
Polecenie diff, podobnie jak sort i compress, moĔe potrzebowaè wiele czasu na wykonanie
zadania, zwäaszcza w przypadku duĔych plików. ZaäóĔmy, Ĕe mamy dwa duĔe pliki o nazwach
wojnaipokój.txt i wojnaipokój.txt.old. Polecenie diff wojnaipokój.txt wojnaipokój.txt.old16
moĔe na przykäad ujawniè, Ĕe autor zdecydowaä siö zmieniè w caäym pliku imiö „Iwan” na
„Aleksander”, wykonaä wiöc setki zmian, a przez to równieĔ zbiór wygenerowanych danych
wynikowych bödzie obszerny.
JeĔeli zostanie wpisane polecenie diff wojnaipokój.txt wojnaipokój.txt.old &, system
bödzie co chwila zwracaä kolejne dane wynikowe, co bödzie trudne do zatrzymania nawet przy
wykorzystaniu technik przedstawionych w rozdziale 7. Natomiast polecenie:
$ diff wojnaipokój.txt wojnaipokój.txt.old > txtdiff &
spowoduje, Ĕe zidentyfikowane róĔnice zostanñ zapisane w pliku txtdiff i bödzie moĔna je przeanalizowaè póĒniej.
16
Aby oszczödziè sobie pisania, moĔna by wpisaè skrótowe polecenie diff wojnaipokój*, o ile tylko nie istniejñ inne pliki o nazwie rozpoczynajñcej siö w ten sposób. NaleĔy pamiötaè, Ĕe diff rozpoznaje argumenty
dopiero po rozwiniöciu przez powäokö symboli wieloznacznych. Wielu uĔytkowników o tym zapomina.
Zadania drugoplanowe
_
33
Zadania drugoplanowe i ich priorytety
Dziöki zadaniom drugoplanowym moĔna zaoszczödziè czas potrzebny na wpisywanie poleceþ. Trzeba jednak pamiötaè, Ĕe takie zadania zuĔywajñ znaczne iloĈci zasobów takich jak pamiöè i czas procesora (CPU). To, Ĕe kilka zadaþ jest wykonywanych jednoczeĈnie, wcale nie
oznacza, Ĕe bödñ one trwaè krócej, niĔ gdyby uruchamiano je jedno po drugim. W rzeczywistoĈci wydajnoĈè zwykle jest nieco niĔsza.
KaĔdemu zadaniu w systemie przypisywany jest priorytet, czyli numer wskazujñcy systemowi operacyjnemu, jaki stopieþ waĔnoĈci naleĔy nadaè zadaniu w sytuacji wyczerpywania
siö zasobów (im wyĔszy numer, tym niĔszy priorytet). Polecenia wpisywane w powäoce — bez
wzglödu na to, czy bödñ to zadania pierwszoplanowe, czy drugoplanowe — zwykle majñ taki
sam priorytet. Administrator systemu ma moĔliwoĈè uruchamiania poleceþ z wyĔszym priorytetem niĔ zwykli uĔytkownicy.
Zwróèmy uwagö, Ĕe uruchamianie w systemie znacznej liczby zadaþ drugoplanowych dla wielu
uĔytkowników moĔe spowodowaè zuĔycie wiökszej iloĈci zasobów, niĔ przysäugujñ danemu
uĔytkownikowi. NaleĔy w takiej sytuacji zastanowiè siö, czy krótszy czas wykonania zadania
jest naprawdö waĔniejszy, niĔ przestrzeganie zasad wspóäuĔytkowania systemu.
A jeĈli mówimy juĔ o zasadach wspóäuĔytkowania systemu, Unix udostöpnia polecenie, które
pozwala na obniĔenie priorytetu dowolnego zadania. Jest to polecenie nice. JeĈli zostanie wpisane nice polecenie — gdzie polecenie moĔe byè nawet skomplikowanym wierszem poleceþ powäoki z potokami, przekierowaniami i tak dalej — wówczas zostanie ono uruchomione
z niĔszym priorytetem17. Aby odpowiednio obniĔyè priorytet, moĔna przekazaè poleceniu nice
argument w postaci liczby. Wiöcej informacji moĔna znaleĒè w podröczniku na stronach poĈwiöconych nice18.
Znaki specjalne i uŜywanie cudzysĥowów
Znaki <, >, | i & to cztery przykäady znaków specjalnych, które dla powäoki majñ okreĈlone
znaczenie. Symbole wieloznaczne przedstawione we wczeĈniejszej czöĈci rozdziaäu (*, ?
i [...]) to równieĔ znaki specjalne.
W tabeli 1.6 opisano znaczenie wszystkich znaków specjalnych, obowiñzujñce jedynie w wierszach poleceþ powäoki. Inne znaki majñ specjalne znaczenie w okreĈlonych sytuacjach (o których wiöcej powiemy w rozdziaäach 3. i 4.), takich jak stosowanie wyraĔeþ regularnych i operatorów przetwarzania ciñgów znaków.
Stosowanie cudzysĥowów
Czasami trzeba zastosowaè znaki specjalne w sposób dosäowny, to znaczy bez ich specjalnego
znaczenia. W tym celu stosuje siö cudzysäowy. JeĔeli ciñg znaków zostanie objöty pojedynczymi apostrofami, wówczas wszystkie znaki objöte apostrofami stracñ swe specjalne znaczenie.
17
DäuĔsze polecenia wystöpujñce za poleceniem nice powinno siö wyróĔniaè cudzysäowem lub apostrofami.
18
Administratorzy systemu zalogowani jako uĔytkownicy root mogñ teĔ poleceniem nice podwyĔszaè priorytety zadaþ.
34
_
Rozdziaĥ 1. Podstawy powĥoki bash
Tabela 1.6. Znaki specjalne
Znak
Znaczenie
Patrz rozdziaĥ
~
Katalog domowy.
1
`
Zastépienie poleceniem (przestarzaĥe).
4
#
Komentarz.
4
$
WyraŜenia i zmienne.
3
&
Zadanie drugoplanowe.
1
*
Symbol wieloznaczny dla ciégu znaków.
1
(
Uruchomienie podpowĥoki.
8
)
Zatrzymanie podpowĥoki.
8
\
Umieszczenie nastýpnego znaku w cudzysĥowie.
1
|
Potok.
1
[
Poczétek symbolu wieloznacznego w postaci zbioru znaków.
1
]
Koniec symbolu wieloznacznego w postaci zbioru znaków.
1
{
Poczétek bloku poleceħ.
7
}
Koniec bloku poleceħ.
7
;
Separator poleceħ powĥoki.
3
'
Silny cudzysĥów.
1
"
Sĥaby cudzysĥów.
1
<
Przekierowanie wejļcia.
1
>
Przekierowanie wyjļcia.
1
/
Separator katalogów ļcieŜki dostýpu.
1
?
Symbol wieloznaczny dla pojedynczego znaku.
1
!
Logiczne zaprzeczenie.
5
Z najbardziej oczywistñ sytuacjñ, gdy ciñg znaków trzeba objñè cudzysäowami, mamy do czynienia w przypadku polecenia echo, które pobiera argumenty i przekazuje je do standardowego wyjĈcia. W jakim celu? Jak przekonamy siö w trakcie lektury kolejnych rozdziaäów, w trakcie przetwarzania wiersza poleceþ powäoka wykonuje stosunkowo duĔo czynnoĈci, z których
wiökszoĈè dotyczy znaków specjalnych wymienionych w tabeli 1.6. Polecenie echo to jedno
z narzödzi, dziöki którym wyniki takiego przetwarzania moĔna udostöpniè na standardowym wyjĈciu.
A gdyby chcieè wyĈwietliè ciñg znaków 2 * 3 > 5 to nierównoŁð faĪszywa? ZaäóĔmy, Ĕe
wpisywane jest nastöpujñce polecenie:
$ echo 2 * 3 > 5 to nierównoĿî faĨszywa.
W odpowiedzi pojawiäby siö znak zachöty, tak jakby nic siö nie staäo! Ale tak naprawdö powstaäby nowy plik o nazwie 5, zawierajñcy cyfrö 2, nazwy wszystkich plików w bieĔñcym katalogu, a takĔe ciñg znaków 3 to nierównoŁð faĪszywa. Warto siö upewniè, Ĕe rozumiemy
przyczynö takiego stanu rzeczy19.
19
Dowodzi to równieĔ elastycznoĈci przekierowaþ wejĈcia-wyjĈcia, które mogñ znajdowaè siö w dowolnym miejscu wiersza poleceþ — nawet takim, w którym na pierwszy rzut oka nie majñ Ĕadnego sensu.
Znaki specjalne i uŜywanie cudzysĥowów
_
35
JeĔeli natomiast wpisane zostanie polecenie:
$ echo '2 * 3 > 5 to nierównoĿî faĨszywa.'
jego wynikiem bödzie ciñg znaków w niezmienionej wersji. Nie trzeba jednak obejmowaè apostrofami caäego wiersza, a jedynie tö jego czöĈè, która zawiera znaki specjalne (albo dla pewnoĈci znaki, które mogñ sprawiaè wraĔenie specjalnych). Polecenie:
$ echo '2 * 3 > 5' to nierównoĿî faĨszywa.
zwróci identyczny wynik.
Zwróèmy uwagö, Ĕe w tabeli cudzysäów (") okreĈlono mianem säabego cudzysäowu. Ciñg znaków ujöty w cudzysäów podlega niektórym czynnoĈciom wykonywanym przez powäokö w trakcie przetwarzania wiersza poleceþ, ale nie wszystkim. (Inaczej mówiñc, tylko niektóre znaki
sñ traktowane jako znaki specjalne). W dalszych rozdziaäach pokaĔemy, dlaczego stosowanie
cudzysäowów jest czasami lepszym rozwiñzaniem. W rozdziale 7. znajdujñ siö szczegóäowe informacje na temat obowiñzujñcych w powäoce zasad traktowania cudzysäowów oraz innych
aspektów przetwarzania wiersza poleceþ. Na razie jednak pozostaþmy przy samych apostrofach.
UniewaŜnianie lewym ukoļnikiem
Kolejnym sposobem na zmianö znaczenia znaku jest poprzedzenie go znakiem lewego ukoĈnika (\). Jest to tak zwane uniewaĔnianie znaku lewym ukoĈnikiem. W wiökszoĈci przypadków poprzedzenie znaku lewym ukoĈnikiem jest równoznaczne z ujöciem go w cudzysäów.
Na przykäad polecenie:
$ echo 2 \* 3 \> 5 to nierównoĿî faĨszywa.
zwróci taki sam wynik, jak gdyby ciñg znaków objöto apostrofami. Aby wykorzystaè w ciñgu
znaków lewy ukoĈnik, wystarczy objñè go apostrofami ('\') albo — co jest jeszcze äatwiejsze
— poprzedziè lewym ukoĈnikiem (\\).
Zajmijmy siö jakimĈ bardziej praktycznym przykäadem obejmowania znaków specjalnych cudzysäowami. Niektóre polecenia Uniksa wymagajñ podania argumentów, które czösto zawierajñ znaki specjalne. Trzeba je zatem uniewaĔniè, aby powäoka nie przetworzyäa ich w pierwszej
kolejnoĈci. NajczöĈciej uĔywanym tego rodzaju poleceniem jest find, które wyszukuje pliki
w caäych drzewach katalogów.
Aby móc uĔyè polecenia find, trzeba wskazaè katalog gäówny drzewa, które ma byè przeszukiwane, oraz podaè argumenty opisujñce charakterystykö poszukiwanego pliku (lub plików).
Na przykäad polecenie find . -name ciîg spowoduje wyszukanie w drzewie katalogów,
którego katalogiem gäównym jest katalog bieĔñcy, plików o nazwach pasujñcych do ciñgu
znaków. (Inne argumenty pozwalajñ na przeszukiwanie pod wzglödem rozmiaru pliku, jego
wäaĈciciela, uprawnieþ, daty ostatniego dostöpu i tak dalej).
W ciñgu znaków moĔna stosowaè symbole wieloznaczne, trzeba jednak umieĈciè je w cudzysäowach, aby polecenie find mogäo dopasowaè je do nazw plików wystöpujñcych w poszczególnych przeszukiwanych katalogach. Polecenie find -name '*.c' wyszuka w katalogu bieĔñcym i jego podkatalogach wszystkie pliki, których nazwy koþczñ siö znakami .c.
36
_
Rozdziaĥ 1. Podstawy powĥoki bash
UniewaŜnianie cudzysĥowów
Wykorzystujñc lewy ukoĈnik, moĔna równieĔ umieszczaè znaki cudzysäowu w ciñgu znaków
objötym cudzysäowami. Na przykäad polecenie:
$ echo \"2 \* 3 \> 5\" to nierównoĿî faĨszywa.
zwróci nastöpujñcy wynik:
"2 * 3 > 5" to nierównoŁð faĪszywa.
Mechanizm ten nie zadziaäa jednak w przypadku apostrofów znajdujñcych siö wewnñtrz wyraĔeþ objötych apostrofami. Na przykäad polecenie echo 'Herbatka u Harry'ego' wcale nie
zwróci ciñgu znaków Herbatka u Harry'ego. Ograniczenie to moĔna obejĈè na kilka sposobów. Najpierw spróbujmy wyeliminowaè apostrofy:
$ echo Herbatka u Harry\'ego
JeĔeli Ĕadne pozostaäe znaki nie sñ znakami specjalnymi (a tak jest w tym przypadku), rozwiñzanie to zadziaäa. W przeciwnym razie moĔna wykonaè nastöpujñce polecenie:
$ echo 'Herbatka u Harry'\''ego'
W tym przypadku zapis '\'' (czyli apostrof, lewy ukoĈnik, apostrof, apostrof) zadziaäa tak,
jakby apostrof znajdowaä siö w ciñgu znaków objötym apostrofami. Dlaczego? OtóĔ pierwszy
znak ' w ciñgu '\'' koþczy pierwszy ciñg objöty apostrofami ('Herbatka u Harry), \' dodaje
znak apostrofu, a nastöpny apostrof rozpoczyna kolejny ciñg znaków objöty apostrofami, zawierajñcy litery ego. Zrozumienie tej zasady pozwoli uniknñè käopotów zwiñzanych ze zrozumieniem innych skomplikowanych zagadnieþ dotyczñcych skäadni powäoki.
Kontynuacja wierszy
Kolejnym zagadnieniem jest sposób, w jaki moĔna kontynuowaè tekst polecenia, które na terminalu lub stacji wykracza poza jeden wiersz. OdpowiedĒ jest w zasadzie prosta: wystarczy
ujñè w cudzysäów klawisz RETURN. W koþcu RETURN to jeszcze jeden zwykäy znak.
Taki cel moĔna osiñgnñè na dwa sposoby: koþczñc wiersz lewym ukoĈnikiem lub nie wpisujñc koþczñcego znaku apostrofu (czyli ujñè klawisz RETURN w cudzysäów). JeĔeli zastosowany
zostanie lewy ukoĈnik, wówczas miödzy nim a koþcem wiersza nie moĔe siö juĔ nic znajdowaè — nawet spacja czy znak tabulacji.
Gdy zastosowany zostanie lewy ukoĈnik lub znak apostrofu, bödzie to informacja dla powäoki, Ĕe naleĔy zignorowaè specjalne znaczenie klawisza RETURN. Po jego naciĈniöciu powäoka
rozpozna, Ĕe tekst polecenia nie zostaä jeszcze zakoþczony (bo przecieĔ „prawdziwy” klawisz
RETURN nie zostaä jeszcze naciĈniöty). WyĈwietlony zostanie zatem drugi znak zachöty, domyĈlnie majñcy postaè >, i powäoka dalej bödzie oczekiwaè na zakoþczenie wiersza. Wiersz moĔna kontynuowaè nieograniczonñ iloĈè razy.
GdybyĈmy na przykäad chcieli wyĈwietliè w powäoce pierwsze zdanie z Ogniem i mieczem Henryka Sienkiewicza, moĔna by wpisaè nastöpujñce polecenie:
$ echo Rok 1647 byĨ to dziwny rok, w którym \
> rozmaite znaki na niebie i ziemi zwiastowaĨy \
> jakoweĿ klĀski i nadzwyczajne zdarzenia.
Znaki specjalne i uŜywanie cudzysĥowów
_
37
Taki sam efekt moĔna osiñgnñè tak:
$ echo 'Rok 1647 byĨ to dziwny rok, w którym
> rozmaite znaki na niebie i ziemi zwiastowaĨy
> jakoweĿ klĀski i nadzwyczajne zdarzenia.'
Klawisze kontrolne
Klawisze kontrolne, czyli kombinacje klawisza CONTROL (albo CTRL) oraz drugiego klawisza,
to kolejny rodzaj znaków specjalnych. Zwykle po ich naciĈniöciu na ekranie nie pojawiajñ siö
Ĕadne znaki, natomiast system operacyjny interpretuje niektóre z nich jako polecenia specjalne. Jeden z takich klawiszy juĔ znamy: RETURN jest toĔsamy z klawiszem CTRL+M (moĔna
samemu siö o tym przekonaè). Czösto uĔywa siö równieĔ klawiszy BACKSPACE lub DEL w celu
usuniöcia bäödów literowych popeänionych w wierszu poleceþ.
Tak naprawdö dziaäanie wielu klawiszy kontrolnych nie dotyczy w Ĕaden sposób uĔytkownika. Warto jednak je poznaè na zapas, takĔe na wypadek niezamierzonego naciĈniöcia któregoĈ z nich.
Chyba najbardziej käopotliwym aspektem korzystania z klawiszy kontrolnych jest to, Ĕe ich
dziaäanie moĔe byè odmienne w róĔnych systemach. Standardowe dziaäanie takich klawiszy
przedstawiono w tabeli 1.7, zawierajñcej listö klawiszy kontrolnych obsäugiwanych przez wszystkie najwaĔniejsze wspóäczesne wersje Uniksa. Zwróèmy uwagö, Ĕe klawisze DEL i CTRL+?
majñ takie samo dziaäanie.
Dziöki poleceniu stty moĔna sprawdziè aktualne ustawienia oraz zmieniè je w razie potrzeby
(wiöcej informacji na ten temat znajduje siö w rozdziale 8.). JeĔeli uĔywana wersja Uniksa wywodzi siö z systemu BSD (na przykäad jest to Unos albo OS X), moĔna wpisaè polecenie stty all
i wyĈwietliè w ten sposób ustawienia klawiszy kontrolnych. Na ekranie pojawiñ siö informacje
podobne do poniĔszych:
erase
^?
kill
^U
werase rprnt
^W
^R
flush
^O
lnext
^V
susp
^Z/^Y
intr
^C
quit
^\
stop
^S/^Q
eof
^D
Tabela 1.7. Klawisze kontrolne
Klawisz kontrolny
Nazwa stty
Opis funkcji
CTRL+C
intr
Zatrzymanie bieŜécego polecenia.
CTRL+D
eof
Koniec danych wejļciowych.
CTRL+\
quit
Zatrzymanie bieŜécego polecenia, jeŜeli CTRL+C nie dziaĥa.
CTRL+S
stop
Przerwanie wyļwietlania danych wynikowych na ekranie.
CTRL+Q
Ponowne uruchomienie wyļwietlania danych wynikowych na ekranie.
DEL albo CTRL+?
erase
Usuniýcie ostatniego znaku.
CTRL+U
kill
Usuniecie caĥego wiersza poleceħ.
CTRL+Z
susp
Zawieszenie bieŜécego polecenia (wiýcej o tym w rozdziale 8.).
Zapis ^X oznacza klawisz CTRL+X. JeĔeli uĔywany system wywodzi siö z System III albo System V (naleĔñ do nich AIX, HP/UX, SCO, Linux i Xenix), naleĔy wpisaè polecenie stty -a.
Komunikat wynikowy bödzie zawieraä nastöpujñce informacje:
intr = ^C; quit = ^|; erase = DEL; kill = ^u; eof = ^d; eol = ^';
swtch = ^`; susp = ^z; dsusp <undef>;
38
_
Rozdziaĥ 1. Podstawy powĥoki bash
NajczöĈciej uĔywanym klawiszem kontrolnym jest CTRL+C, czasami nazywany klawiszem przerwania. Zatrzymuje on (a przynajmniej próbuje zatrzymaè) aktualnie wykonywane polecenie.
Klawisza tego uĔywa siö na przykäad w sytuacji, gdy wpisane polecenie okazuje siö dziaäaè
zbyt däugo, w poleceniu wpisano zäe argumenty, uĔytkownik zrezygnowaä z dalszego wykonywania polecenia itp.
Czasami klawisz CTRL+C nie dziaäa. W takim przypadku, jeĔeli potrzeba zatrzymania polecenia jest naprawdö palñca, naleĔy nacisnñè CTRL+\. Nigdy jednak nie powinno siö od razu
beztrosko stosowaè CTRL+\ — zawsze trzeba najpierw spróbowaè uĔyè CTRL+C! Szczegóäowe informacje, dlaczego naleĔy tak postöpowaè, znajdujñ siö w rozdziale 8. Na razie wystarczy wspomnieè, Ĕe po naciĈniöciu CTRL+C dziaäajñce polecenie ma wiöksze szanse po sobie
„posprzñtaè”, tak aby pliki i inne uĔywane przez polecenie zasoby z powrotem przybraäy odpowiednie stany.
Przykäad dziaäania CTRL+D juĔ przedstawiono. Gdy zostanie uruchomione polecenie przyjmujñce dane wejĈciowe pochodzñce z klawiatury, naciĈniöcie CTRL+D bödzie stanowiäo dla procesu informacjö, Ĕe nastñpiä koniec danych wynikowych — tak samo, jakby proces odczytywaä
dane z pliku i dotarä do jego koþca. Klawisz ten czösto stosuje siö na przykäad w trakcie pracy z programem narzödziowym mail: gdy wpisywana jest wiadomoĈè, w celu jej zakoþczenia
naciska siö CTRL+D. W ten sposób mail otrzymuje informacjö, Ĕe wiadomoĈè jest juĔ skoþczona i gotowa do wysäania. WiökszoĈè programów narzödziowych, które pobierajñ dane ze
standardowego wejĈcia, interpretuje klawisz CTRL+D jako znak koþca danych wejĈciowych,
choè wiele z nich rozpoznaje równieĔ polecenia takie jak q, quit, exit i im podobne.
Klawisze CTRL+S i CTRL+Q to tak zwane znaki sterowania przepäywem. Stanowiñ one przestarzaäy sposób zatrzymywania i restartowania przepäywu danych wyjĈciowych, generowanych
przez jedno urzñdzenie, do innego (na przykäad z komputera do terminala), przydatny w czasach, gdy takie operacje trwaäy dosyè däugo. Obecnie, w czasach szybkich poäñczeþ sieciowych, wäaĈciwie sñ bezuĔyteczne. Tak naprawdö CTRL+S i CTRL+Q sprawiajñ tylko käopot.
Warto o nich wiedzieè jedynie to, Ĕe jeĔeli generowanie danych wynikowych na ekranie nagle zatrzymaäo siö, prawdopodobnie uĔytkownik przez przypadek nacisnñä klawisz CTRL+S.
NaleĔy wówczas nacisnñè CTRL+Q, aby ponownie uruchomiè tö czynnoĈè. Trzeba jednak pamiötaè, Ĕe wówczas zostanñ uwzglödnione wszystkie klawisze naciĈniöte w miödzyczasie.
Ostatnia grupa znaków kontrolnych to podstawowe narzödzia edycji w wierszu poleceþ. Klawisz DEL dziaäa jak klawisz BACKSPACE (tak naprawdö w niektórych systemach usuwanie
odbywa siö za pomocñ klawisza BACKSPACE albo CTRL+H, a nie DEL), a CTRL+U usuwa
caäy wiersz poleceþ i pozwala uĔytkownikowi na wpisanie go na nowo. RównieĔ te klawisze
nie sñ juĔ powszechnie uĔywane20. Nastöpny rozdziaä dotyczy trybów edycji powäoki bash,
które stanowiñ jeden z najbardziej przydatnych mechanizmów i majñ znacznie bogatsze moĔliwoĈci niĔ ograniczone w swych funkcjach klawisze kontrolne, opisywane w tym punkcie.
20
Dlaczego nadal funkcjonujñ takie przestarzaäe klawisze kontrolne? Nie majñ one nic wspólnego z samñ powäokñ, sñ natomiast rozpoznawane przez sterownik tty — starñ wewnötrznñ czöĈè systemu operacyjnego, kontrolujñcñ dane wejĈciowe i wyjĈciowe przesyäane do (z) terminala.
Znaki specjalne i uŜywanie cudzysĥowów
_
39
Pomoc
Rozwiñzaniem charakterystycznym jedynie dla powäoki bash jest system pomocy online. Polecenie help wyĈwietla informacje na temat poleceþ dostöpnych w powäoce bash. JeĔeli zostanie
wpisane samo polecenie help, zwrócona zostanie lista wbudowanych poleceþ powäoki wraz
z dostöpnymi dla nich opcjami.
JeĔeli polecenie help zostanie wywoäane wraz z nazwñ polecenia powäoki, wyĈwietlony zostanie szczegóäowy opis podanego polecenia:
$ help cd
cd: cd [-L | -P] [dir]
Change the current directory to DIR. The variable $HOME is the
default DIR. The variable $CDPATH defines the search path for
the directory contatining DIR. Alternative directory names in
CDPATH are separated by a colon (:). A null directory name is
the same as the current directory, i.e. `.'. If DIR begins with
a slash (/), then $CDPATH is not used. If the directory is not
found, and the shell option `cdable_vars' is set, then try the
word as a variable name. If that variable has a value, then cd
to the value of that variable. The -P option says to use the
physical directory structure instead of following symbolic links;
the -L option forces symbolic links to be followed.
Polecenie help moĔna wywoäywaè jedynie z czöĈciñ nazwy polecenia — wówczas zostanñ wyĈwietlone szczegóäowe informacje na temat wszystkich poleceþ pasujñcych do podanej czöĈci
nazwy. Na przykäad wpisanie help re spowoduje wyĈwietlenie opisu poleceþ read, readonly
i return. Fragment nazwy moĔe zawieraè symbole wieloznaczne. W takiej sytuacji trzeba bödzie
objñè czöĈè nazwy apostrofami, aby nie zostaäa rozwiniöta do nazwy pliku. Efekt identyczny
jak w poprzednim przykäadzie da polecenie help 're*', natomiast help 're??' spowoduje
wyĈwietlenie opisu jedynie polecenia read.
Czasami polecenie help zwróci tyle informacji, Ĕe nie bödñ siö one mieĈciè na jednym ekranie
i ekran zostanie przewiniöty. MoĔna wówczas uĔyè polecenia more, aby wymusiè wyĈwietlanie
tylko jednego ekranu naraz — naleĔy zatem posäuĔyè siö poleceniem help polecenie | more.
40
_
Rozdziaĥ 1. Podstawy powĥoki bash