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