System operacyjny UNIX dla poczatkujacych i zaawansowanych, rozdzial5


Rozdział J

Powłoka

Charakterystyka ogólna powloki Po zare estrowaniu si u' kownik m

ę zyt a dostęp do systemu poprzez interpretator poleceń nazywany powloką (ang. shell). Może uruchamiać własne programy aplikacyjne bądź ogólnie dostępne programy systemowe. Związek między użytkownikiem pracującym przy terminalu, powłoką a jądrem systemu pokazano na rys. 5.1

Jadro systemu UNIX

III~IIIIIIIIIIlI II!llhRli~lff~~If

Rys. 5.1. Użytkownik, powłoka a jądro systemu [11]

Powłoka w systemie LTNIX zapewnia komunikację między użytkownikami a systemem. Jest ona w stosunku do jądra zwykłym programem aplikacyjnym, w związku z tym nie rezyduje na stałe w pamięci operacyjnej, a często bywa dopasowywana do potrzeb użytkowników. W systemie są zazwyczaj dostępne dwie wersje powłoki: Bo2srne Shell oraz U.C. Berkeley C Shell. Powłoka jest inicjowana automatycznie po zarejestrowaniu się użytkownika w systemie. Skoro jednak jest to zwykły program aplikacyjny, to jego nowy egzemplarz można uruchomić w dowolnej chwili poleceniem sh. Innymi słowy, polecenie sh uruchamia nowy proces interpretatora czytając dane z klawiatury. Wszystkie następne polecenia są kierowane do systemu operacyjnego przez powłokę.

Ogólna postać poleceniajest następująca:

polecenie argument 1 argument 2 ...

Polecenia systemu operacyjnego LJNIX nie mają formalnie zdefiniowanej, standardowej postaci. Panuje jedynie ogólna zasada, że wszystkie nazwy poleceń mają od dwóch do dziewięciu znaków: małych liter i cyfr. Wyróżnia się trzy rodzaje argumentów poleceń: pliki, opcje i pozostałe - zależnie od rodzaju polecenia. Opcje dotyczą sposobu

74 Rozdział 5.

wykonywania polecenia i są zawsze jednoliterowe (choć można łączyć litery w grupy), poprzedzone myślnikiem. Średnik traktuje się jako znak końca polecenia. W jednym wierszu można więc zapisać kilka polećeń dla powłoki, rozdzielając je średnikami. Powłoka wykona je tak, jakby każde z nich podano w osobnym wierszu.

Jak wspomnieliśmy we wstępie, w systemie LJNIX można wykorzystywać tak zwane znaki uogólniające w nazwach plików będących argumentami poleceń. Warto tutaj zwrócić uwagę, że istnieje możliwość pozbawienia znaków uogólniających ich specjalnych własności. Można tego dokonać za pomocą innych znaków uogólniających, tj. kresek ukośnych (\) (ang. backslash) i cudzysłowów ("). Kreska ukośna użyta w poleceniu do programu powłoki służy do przywrócenia dowolnemu znakowi uogólniającemu jego normalnego, znakowego znaczenia. Kreski ukośne oddziałują na pojedyncze znaki, a nie na ich ciągi. Aby przywrócić dosłowne znaczenie ciągowi znaków, należy ująć go w cudzysłowy.

Ponieważ powłoka w czasie interpretowania polecenia może zrozumieć znaki uogólniające w sposób nie przewidziany przez użytkownika, wprowadzono polecenie echo, pozwalające sprawdzić efekt danego wiersza z poleceniem. Polecenie echo nie robi nic oprócz wypisania na ekranie terminalu argumentów podanych po nazwie polecenia. Parametry te pojawiają się jednak w pełńej, rozwiniętej postaci. Przypuśćmy, że użytkownik przed wykonaniem nieodwracalnego polecenia, np. rm, ma wątpliwości dotyczące plików o nazwach tekst*. Może więc wstępnie sprawdzić, jakie pliki będą usunięte w wyniku tego polecenia wydając polecenie echo w następującej postaci:

$ echo tekst"

tekst_1 tekst_2 tekst_c

W odpowiedzi na ekranie ukazują się wszystkie bieżące wartości odpowiadające podanemu argumentowi, tzn. wszystkie nazwy plików z katalogu bieżącego pasujące do podanego wzorca, zawierającego znaki uogólniające. W poleceniu echo można wykorzystywać znaki uogólniające również w inny sposób, np.

$ echo ???

Rozpoznane zostaną nazwy wszystkich plików o długości trzech znaków.

Powłoka przyjmuje pólecenie od użytkownika, dekoduje je i przekazuje do jądra w celu wykonania. Pracę powłoki można przedstawić algorytmicznie jako ciąg następujących czynności [15]:

• wysłanie znaku gotowości ($) na terminal, przyjęcie polecenia od użytkownika,

zdekodowanie polecenia i odszukanie w katalogach odpowiadającego mu programu,

przekazanie polecenia do jądra w celu utworzenia odpowiedniego procesu (lub procesów) realizującego polecenie i oczekiwanie na jego zakończenie, przyjęcie odpowiedzi od jądra i przekazanie tych wyników użytkownikowi, powrót do punktu pierwszego.

Czynności te wykonuje się w pętli aż do napotkania przez powłokę znaku Ctrl-d wprowadzonego z klawiatury. Powłoka zleca w'owczas jądru zamknięcie sesji użytkownika (przypomnijmy, że z punktu widzenia powłoki ciąg znaków wprowadzanych z klawiatury jest podobny do pliku, a więc Ctrl-d traktuje się jako koniec informacji z terminalu).

amBMOSa~pEazid rnuazozsyz atu~ajn ~so~Bmuz eypazJdod o~af o; `nd~;sop EMEld ampa~MOdpo obaw op ~Cwstlatw t łey;sl znf yazaf E `.rCuomoMln nniaadfzu aluelsoz `łmu;st am p~;op yazaf `alosf~Cnn ;saf ausnUSnnosaipzazid o~aJO;~ op `~lld

„«„ MoxEUZ Eluazo;z o~f~M~Czn ~fostwo3w ~u>?zpeMOid~Cnn g~Cza~łop odam op >?uzow o; `nxyd IosouzMgz fampazidod g~Czozsiu aza~zu aiu ysaf yuaoa~od o~aupaf EIUEMF~U03~~SA1 SEZO EU Oxj~Cj afnzżiMOqo o~amoiosf~Cnn puarwru;s odaMOpi~pu>?;s ~uzowz ~ `>?~ołMOd zwzs a~IM afnuox~M aluuMOSaipuaz~d s~ nwBnold op ~iu2M~zexazid ;saf aru v ~xofMOd zazid ~SuEMO;gidia;y ;saf `t?iuaoajod ~tas~zo ~io~p~q `, sf~a/Ijd<„ ;sxaZ

's~ e~uaoalod >?IUełEIZp yu~SM sj ~/rjd n~yd IOSOj3EMEZ fampaudod op zo~łop - ś/-a/tTd« s~ ~sj ~Ijd

n~yd M (n~olElux ~SOj3EMEZ 'f;) s~ Eluaaalod elui?fyzp xiwCM gsaTwn - sl ~/rld< s~ `n~oiezex ~sou>?Mez yspnal atuzn~a zu zsid~iM - s~ n~emuxla; usya eu ;SEIUiEZ (sj-yjd du) nxtfd o~aujonnop op ct~o~~Lx M qotCa.reMEZ

n1o~[tfd zsx~t~tt ~tzpt?nloldnt euzour s~ eruaaafod a~f~naizn `onnopi?fyizrd ~„<„ ~ „>„ ~wexEUz ompaoMOdpo auozasuzo ~s EIUBZpEMO.IdlfM I ~2IU2zpEMO1dM Djlinlalx o~annoIasGCn~ ztuatwru;s awBStd~Czid auowalwz amM~f aIU>?;soz aw Ixodop `~odop muazazuzazid aostavw aulslwop tat matMOq o~ psa( ~ `n;eutumal am2ya zu ~tS EłiMEIod Moxtld t?;sy ~Cqe `muep~z o~anno~~Bpop zaq s~ amaoalod g~pod gzam;sóM n~o1>?l~~[ pso~ISMez p>?std~iM o~oqa pzłySzid BN yauiM pEnnoiaTyCza~zu atzp~ `p~MZpod o~IM tsnw aIu ~tunno~;.czn o~annolasfann muatwru;s o~an~oplzpu~;s az qo~fuzp afnxazoo I o~annomsf~t Bmalwru;s o~aMOpmpuz;s op af afnsldM afaemo3y qoio~fnsld~Cnn MOwe1~01d gsozsx~IM wlumw~a; nu>;ya z ~S.m;sIMZIx op ompaoMOdpo auozoźfop~auo ~s amlzmoN vfMOrosGfnt uatu~rups ~f'etop.~bpubTS mf'etor~sfant uarurn.r~s ~fnloprnpun;s aluzo~ewo;nt? AIS afnsld.izld eluulwzqon.m I~Imqo M rMOSaooid nwapzsx 'exiunnox~izn ~~p aupo8.(m gum >?u Ifa~mo3ul ~IU~zpEMO~d~Cnn ~ I EIUEZpLMO1dM UOZp~z3n

ya~CMOpmpue;s awstwz cu s~alod ~IOSGCM/eysfaM aw~mzCMOSa.cpeaz.~d o ~iasf~fn~~~~~sfan~ aiu~n~~fMOSaap~azad

uluarupo~opn a; amoaqo ~iwlMOwp ~wawa;s~is z HyuMOx~Czn ~foeid M uampo~opn ~aiazs Eu.>?IuMZOd XI~ nwa;s~is >?xofMOd

~qiqolz o; oMZld ~fEw I ~oqo ~Calun~o~vizn ox~~ a~zp~ `xarnn~oxarzp~ auEZazsaiwn g~iq ~~ow nno~iumox~izn ~Cwsl~old wryp n~oi~;ux M ~~s ysa~w qo~Cnno~rysn Mourel~old qo~(mowa;s~is ~sozs~~IM wxluMO~uCzn nxlld >?n~zBU a o~an~owa;s~Cs s~uaoa~od ~iMZeu AIS ~f~M~G~od T~saf `gEpod .Czasu ~MO~zaTas ~MZBU ~ufad ~amzo~ewo;n~ qo~CueMtxnzsazid Mo~oj>?;e~ z w~Cupaf r.~ o~aui?sldez n~tld fanno~zalos ~MZeu faulad wazei w~ipzex az Eluennzpod ~~u~tun euzow nwa; I3~~IZQ 'EIU2MOUOx~AA oMEJd Ew xiuMOxuizn o~a.IO1~ op~nxunso;s n~ `o~ałyCMZ n~I1d ~MZi?u o~$f Mo~ofe;~x z w~fupaf n~ AIS qlMUfod Isnw eruaoalod eMZeN ' wrq~.rsn~ ~oI>?;Bx (£

`utq~ ~o1~;Ex ~Z `ex~unnox~izn ~io~zalq ~o~;$x (I aasoufa~ox fao~fnd~;sEU nn foko su `qa>?dore;~x n~ ~u~n~rxnzs6m

zuo ;saf o; `nwuWold ~n~zeu ox>?f yuaoajod ~MZeu afnlxBi; >,xołMOd zen~aruod

S` mjojmod

76 Rozdział 5.

> plik

spowoduje utworzenie pustego pliku, nawet jeżeli nie zostanie podane żadne polecenie. Tą samą metodą można wyprowadzać jednocześnie informacje dostarczane przez

kilka poleceń, podając ich nazwy rozdzielone średnikami w jednej linii i ujmując w nawiasy.

Podobnie jak zmienia się standardowy strumień wyjściowy, można zmienić standardowy strumień wejściowy (inaczej - standardowe wejście) posługując się znakiem "<". Na przykład polecenie

sort <telefony >telefony_sort

oznacza, że program sortujący sort pobiera dane z pliku telefony, a wyniki wysyła do pliku telefony-Bort.

W wielu poleceniach argumentami mogą być nazwy plików, a ich brak oznacza żądanie skorzystania ze standardowego strumienia wejściowego i wyjściowego. Na przykład wprowadzone wcześniej polecenie cat powoduje skopiowanie jednego lub więcej plików będących argumentami do standardowego strumienia wyjściowego. Polecenie to może być wykorrystywane w następujących postaciach:

cat plik-I plik2 - konkatenacja dwóch plików i wprowadzenie wyników do standardowego strumienia wyjściowego, czyli na ekran terminalu;

cat plik I - wyświetlenie pliku na ekranie terminalu;

cat - jeśli nie występuje nazwa pliku, to będzie kopiowana zawartość strumienia wejściowego; tak więc cat w tej postaci powoduje wypisanie na terminalu dodatkowego echa wszystkiego, co napisano na klawiaturze;

cat plik_I plik2 > plika - konkatenacja dwóch plików i wprowadzenie wyników do pliku plik_3 (zamiast do standardowego strumienia wyjściowego, cryli na ekran).

Istnieje dodatkowo trzeci standardowy strumień, tzw. diagnostyczny. Do niego są kierowane komunikaty o błędach i inne sygnały pomocnicze. Zmiana standardowego strumienia wyjściowego nie ma wpływu na strumień diagnostyczny - jest nim zawsze ekran terminalu.

Sesja nr 14 przy terminalu

~ . Wykorzystując polecenie echo sprawdź, które pliki w twoim katalogu zawieraja w nazwach siowa: łekst i pliki. Sprawdź, czy w Twoich katalogach znajduje się pliki, których nazwy maja długość pięciu znaków.

2. Sprawdź, jaki będzie rezultat działania następujacych poleceń: echo * echo "*" echo '*' echo ' *'

echo p echo "p" echo ~ echo (x,y,z)

3. Wykorzystujac technikę przeadresowywania wejścia/wyjścia utwórz plik pusty o nazwie plik~usty. Sprawdź, czy rzeczywiście został utworzony wykorzystujac w tym celu polecenia Is i echo.

4. Przećwicz następujące warianty wykonywania polecenia cat:

Powłoka % %

. wykonaj konkatenację plików pracownicy_1 i pracownicy_2 wyprowadzaj~,c wyniki:

na ekran terminalu,

do pliku pracownicy_cat,

. wyświetl plik pracownicy_cat na ekranie terminalu,

• sprawdź działanie polecenia cat jako funkcji echo wszystkiego, co napisano na klawiaturze. Jak przerwać działanie tego polecenia ? 5. Sprawdź różnicę w działaniu poleceń złożonych:

date; Is -/a) >plik Is> date; Is -la >plik Is2

Porównaj oba pliki wynikowe z wykorzystaniem jednego z poznanych wcześniej programów usługowych.

ó. Zakończ sesję przy terminalu.

Aby rozwiać ewentualne wątpliwości, skomentujemy punkt 4 ostatniej sesji przy terminalu. Polecenie złożone w pierwszej postaci spowoduje wyprowadzenie bieżącej daty i aktualnego czasu oraz listy plików z bieżącego katalogu do pliku plik_lsl. Natomiast polecenie złożone w drugiej postaci spowoduje wyprowadzenie daty i czasu na ekran terminalu, a listy plików z bieżącego katalogu do pliku plik_1s2. Innymi słowy, przeadresowanie wyjścia w tym drugim przypadku dotyczy tylko polecenia Is.

lail

Przetwarzanie potokowe

Powłoka umożliwia utworzenie lączy komunikacji między procesami i tworry tzw. potok (ang. pipeline). Łącza kierują wyniki jednego programu do wejścia drugiego. Dla jednego programu łącze stanowi

plik wyjściowy, dla drugiego - plik wejściowy. Łącze przedstawia się jako ";" lub pionową kreskę ~ . Tak więc przetwarzanie potokowe to bezpośrednie przekazywanie danych z jednego programu usługowego do drugiego. Innymi słowy, łącze tworry się wiążąc bezpośrednio standardowy strumień wyjściowy procesu ze standardowym strumieniem wejściowym następnego, bez żadnego fizycznego pliku pośredniego. Na przykład

$ who ~ Ip

jest żądaniem wykonania potoku składającego się z dwóch procesów wykonujących programy who i Ip (ten drugi kopiuje strumień wejściowy na drukarkę). Po zdefiniowaniu potoku jądro natychmiast uruchamia oba procesy. W tak skonstruowanym potoku wyniki programu who są przekazywane do programu Ip od razu po ich pojawieniu się, bez czekania na zakończenie pracy pierwszego programu. Następująca sekwencja poleceń

$ who >plik_pomoc $ Ip <plik_pomoc

realizuje to samo, z tą różnicą, że proces Ip zostanie uruchomiony dopiero po zakończeniu programu who. Tak więc wspomniany powyżej potok jest rozwiązaniem znacznie bardziej efektywnym pod względem czasu wykonania.

~Cuumiox aumad aT~IMOUEIUI E `„aTU;UańIIa;UI„ faizp.req `ga~zpaynod ~uzouz `dis afnmoqo~z ad w~Woid nxo;od faz~Cnnod unuwuuzodsm aM aCmosoj qosods m Eu~uwqo n;sosd od ;saf o; `amwn~ox fauolsaixo m AIS IUS2Iw aIU EfJEUI103Ui 2UEI;aIMS~eY1 I~Saf ~I IOS~Z~ aUM01 gzi; ~u ;saf ~iuo~arzp uEya az `qosods~ aa; ~m ~ł~izp omopmpuE;s £- ad uzei~oid

E- ~d I e~- sl $

'f; `n~o~od o~auqopod pEłyCz.~d ~Cwzemzog ~aaow urei~oid n~ao iu~ m a~fn;s~Cziox~Cm g~p~i~azid guzom aizp~q xnip~iM (ad muaoaiod ~- Bfodo) qazuwnlox qaaia;zo m nxn.ip~Cm o~auzmoomol;s ox~f ts~~ n~ol~;~x toso;.rem~z unia ~u amazp~moid~Snn afnpomods

aaow I ~- ~d I !soi s! $

11IT3 P~ł~I~ld ~N 'i;h3 0~1~~ 9~^sOa~3d a~zp~q ad `moxyd mzeu ~Cucafnx~Coads~Cnn aiu ~~azaf nuxsuoys ~izpym nuty qo~Cujom ~isd a~f~~m~;soz r nuy 99 ~aso~nłp o ~Cuoi;s auzmoiawnu Eu xrup~Sm ~~~aozp o~amopmpu~~s mosf~Cnn op njild au~moxy~iaads~inn afmdoxs uz~i~old `if~do ~Cw~pod aru ad ~~fnłom~im yazar vurefado ~Cuemoia;s ;saC nxrup~inn ;EUUO,q wxcup~inn op yId ~Ca~fnmo;o~~Szid - ad ;saf s;~T3~ oxef o~s~zo o~auem~Szn mu~l~oid wapEłx~izld uuuui

„finy„ da~6 I e~- sl $

n~ol~;sx uz~i~ m AIS ~fnpf~uz r ntud.tais m auzmox~Cpouz ~~Cq aio;x `mo~ild mu~xnzs~Cnn qnI

!- onn I s! $

:UI~O~Z2Iq rióOIE;Ex m `pBłyCz~d 2U `q~~EMEZ M03~Iid ~~uazoyod Op ~~;S~CziOx~im ~f Euzoy~ wxi~d eauox E~uaid~;sónn op ze o~amoprepu~;s ~~osfam z qo~Cuspod (~- efodo) nuy ~qzml ~zayqo a.N awaoa~od pełyCz.zd EN ~auui i ad `~os~`an~ `aaow `;~a smaoalod ~~mo~~id ~~om s;y3 ox~r ~o~amoiosGCm a~ua~wru;s~ o~amopmpuE;s op ~Cuezp~mold~inn ;saf `OńaMOI~SfaM 2IUaIUIriI;S oóaMOpJEPUE;S I~SOj1EMEZ I LLBpEZ nUI qo~Cuo~nn~;sod po ~Cuzajez~ `ncusWoid o~ap(z; ;~;Inza~ ~qoe;ska; ~u ~ qo~Co~fruado qo~inno~nłsn momzl~oid ~uwnpo źuzoxyioads ~s ~;Ig ~C{n~al Z uua.rjTrf ~iusm~Czeu ;saf `nyld Z If~EUI103Ui fauo~sayo muzmqW po~Cnn op ~Cuozo~euzazid `nxo;od fEZpol ~iu~Bfoads

~a~usazooumoi gemoosid nxo;od w~ m ~p~q aru ~Cp~iu d~ 1 OqM mows3~oJd ~iSaoold amzo~x~3 az `o; szoEUZp ~a~osf~Snn su oufa~ox ~BZexazid famzod oiaTdop E `amzo~aq~3l~ af gemouosod a~ud~;sBU `2iosfam z azsiaim ay~s~izsm ~s~Caaazsd miaTdfBU uo osnui z~ip~ `nxo~od M ~wE; nf~zpol o~ams ~mous;s ~Co~fnuos wzWold az `~~~mn ~iu~~oimZ rxm~rup zu azqo~ a~uazpemoid~Cnn omox;pop zero afoeuuo3m a; odaa~fma~m~z `o~x ~tpd aimzeu o n~yd awaziom;n `a~wa~srCs M Ijlml~0 fau~ep~ m qo~ia~fnomd qo~extumoxaizn ~o ofa~uuo3m am~mo~uosod afnpomod

dl I o~~l ~!Id aa; I fos I ouM $

xo;od pBłx~izid EN yold uuCuspod m ~idox ~mox;epop w~ ~izld o~zlom; `o~amoiosf~Cnn muatwni;s o~amop.repue;s op ~Cnnocosfam uacuiru;s ~Snnoprepu~;s foms afmdox uapu~i~old ytuz~ł~~zo~ - (;łE;zsx fao~fnzyoqw~is `Z ~ahl po) aa; ureldold ~saf `moxo;od do~rulsuox op qa~iu~m~s~CzioyCnn o;s~zo `mourel~oid qo~Cu;~p~Czid ozpi~q z uz~iupa f

'MOUIEJ~Oid ~CMZBU ~~s af~pod moxyd mzEU ~smurez - Iualcunl;S zIUZSId~Czid ~ius~wz vfoz;ou po ~rs ~uzoi moxo;od Bip ~~f~izid ~fae;ou az `~~Bmn.~iu~goimz

's łnrzpzo~

8G

Powłoka %9

informacji uzyskanej jako wynik działania programu Is -la są usuwane w całości, przy czym nie są one usuwane w sposób losowy.

Jako filtry mogą być używane również programy wyszukujące typu grep. Filtry stosowane są głównie w procedurach powłoki.

Wieloprogramowość

Wszystkie omówione do tej pory polecenia systemowe oraz programy usługowe były uruchamiane w następujący sposób: użytkownik żądał

wykonania danego polecenia, po jego wykonaniu na ekranie pojawiały się wyniki, a następnie odzywał się program powłoki wypisując monit ($), gdy tylko był już gotów do przyjęcia następnego polecenia. Taki sposób współpracy z systemem nazywa się pracą jednoprogramową - system w danej chwili obsługuje tylko jedno żądanie użytkownika. Jednakże, jak już wspomnieliśmy we wstępie, system operacyjny UNIX jest systemem wieloprogramowym, to znaczy takim, który pozwala użytkownikom na współbieżne wykonywanie w danej chwili wielu programów (właściwie należałoby mówić o współbieżnej pracy procesów wykonujących programy, bowiem w systemie UNIX odróżnia się proces, czyli obiekt dynamiczny tworzony przez system, od wykonywanego przez proces programu, czyli obiektu statycznego, zapisanego jako plik). Innymi słowy, w systemie UIVIX jest możliwe uruchomienie pewnego programu i w czasie jego pracy wykonywanie innych czynności na terminalu. Możliwe jest również uruchomienie dwa razy tego samego programu dla różnych zestawów danych.

Aby spowodować równoczesne wykonywanie dwóch programów lub poleceń: poleceniel oraz poleceniel, użytkownik musi nakazać interpretatorowi poleceń uruchomienie poleceniel bez czekania na zakończenie pracy poleceniel. Żądaniem nieczekaniajest znak & (ampersand) podany na końcu polecenial, tzn.:

polecenie1& polecenie2

Programy wykonujące oba polecenia będą pracowały równocześnie, przy czym mówimy, że poleceniel będzie realizowane w tle (ang. background process), natomiast polecenie2 będzie wykonywane jako praca główna. Procesy w tle (inaczej drugoplanowe) rozróżnia się tylko na podstawie ich numerów identyfikacyjnych. Są one wyświetlane przez system na ekranie terminalu. Numery te należy odnotować na wypadek, gdyby zaszła potrzeba usunięcia procesu pracującego w tle.

Do usuwania procesów służy polecenie kill, któremy należy podać argument będący identyfikatorem procesu, tj. PID, oraz opcjonalnie numer sygnału poprzedzony znakiem minus (standardowo jest to sygnał ł5). Tak więc, chcąc wstrzymać proces drugoplanowy należy wydać polecenie kill (zabij):

kilt (nr sygnału] numer ideni~kacyjny

Usunięcie uruchomionego procesu jest oczywiście możliwe, jeśli nie zakończył on jeszcze pracy.

Polecenie kilt może być wykorzystane do odblokowania "zawieszonego" terminalu. W tym celu należy przesiąść się na inny terminal podłączony do tego samego

Rozdziat 5.

systemu i następnie usunąć na zawieszonym terminalu proces odpowiedzialny za zawieszenie. Zazwyczaj jest to jakiś ostatnio uruchomiony program użytkowy.

Identyfikator danego procesu można uryskać wydając polecenie ps -f. Najskuteczniejsrym poleceniem usuwającym każdy proces jest polecenie kilt z numerem sygnału -9. Zwróćmy uwagę, że polecenie kilt wprowadzone w postaci kilt -9 "identyfikator procesu powłoki użytkownika" spowoduje "samounicestwienie" działań użytkownika w systemie (zakończenie sesji przy terminalu wraz ze skasowaniem wszystkich obecnie wykonywanych procesów).

Do określenia stanu procesów w systemie służy polecenie ps (ang. process status - stan procesu). Przykładowo, wydanie polecenia:

$ ps -e

oznaczającego żądanie podania stanu wsrystkich procesów (opcja e), może spowodować wyświetlenie następującej informacji:

PID TTY TfME COMMAND

7133 a02 0:04 sh 7281 a02 0:00 ps

Poszczególne kolumny wydruku oznaczają: identyfikator procesu (PID), terminal, z którego rozpoczęto proces (TTY), czas trwania procesu (TIME) i polecenie wydane w celu zainicjowania procesu (COMMAND).

Wydanie polecenia: $ ps -fl

spowoduje wyświetlenie wszystkich informacji o stanie wszystkich procesów (opcja f, ang. full), w długiej postaci (opcja 1, ang. long).

Innym bardzo przydatnym poleceniem operującym procesami jest sleep, w postaci:

sleep time

Powoduje ono zawieszenie wykonywania procesu na określoną liczbę sekund, podaną jako parametr tego polecenia.

Rozważmy przykład wykorzystania omówionych powyżej poleceń. Wydając jako polecenie w tle:

$ (sleep 60; who)8~ 7288

powodujemy zawieszenie wykonania polecenia who na 60 sekund. System zareagował wyświetlając identyfikator tego polecenia, tj. 7288. Wydając następnie polecenie ps uzyskujemy informacje o aktualnie wykonywanych procesach:

PID TTY TIME COMMAND

7133 a02 0:10 sh 7288 a02 0:04 sleep 7289 a02 0:00 ps

Jeśli usuniemy proces sleep poleceniem: $ kilt 7288

to polecenie who zostanie wykonane natychmiast.

Powloka

81

Sesja nr 15 przy terminalu

~. Skonstrcrul potoki wyrkonujące następujące czynności:

• Wykorzystuja<c program uslugowy grep wyszukaj w pliku pracownicy informacje o osobach specjalizujacych się w problematyce systemów operacyjnych.

Posortuj te informacje według nazwisk. Utwórz plik pomocniczy kto so za pomocą programu tee. Sformatuj w dwóch kolumnach te informacje i wyprowadź je na drukarkę. Przeanalizuj działanie tego potoku zwracaj~,c uwagę na następuj~ce problellly:

w potoku jest obecny program Bort; co on powoduje przy takiej konstrukcji potoku ?

iflformaCJe zawarte W pliku pracownicy sa umieszczone w kilku

kolumnach; co spowoduje próba sformatowania tego pliku do postaci dwukolumnowej przez program pr ?

Z wykorzystaniem programu tr wykonaj zamianę wszystkich wielkich liter w pliku plik_a_wielkie na małe litery. Sformatuj plik wynikowy do postaci 4-kolumnowej i wyprowadź go na ekran terminalu.

Zlicz liczbę plików w jednym z twoich katalogów. Wynik wyprowadź na ekran terminalu.

Sprawdź, czym różni się działanie polecenia Is ; who od polecenia Is I who.

2. Wywołaj edytor vi. Utwórz plik o nazwie sortowanie wpisując doń program napisany na przykład w języku C, wykonujacy sortowanie zestawu n liczb w odwrotnej kolejności. Jedna z możliwych wersji takiego programu zamieszczono w dodatku A.

3. Wykonaj kompilację tego programu. Jeśli sygnalizowane sa błędy, to ponownie wywołaj edytor vi i wykonaj stosowne poprawki.

4. Uruchom program sortowanie jako proces w tle, a sam przejdź do wykonywania innych czynności, np. do porzadkowania swoich katalogów. Sprawdź numer identyfikacyjny procesu w tle. Spróbuj usunąć ten proces poleceniem kill. Jeśli w tym czasie proces drugoplanowy się zakończył, to uruchom ponownie program sortowanie dla innej wartości parametru i spróbuj jeszcze raz go usunąć.

5. Spróbuj uruchomić jako proces w tle program wc z opcja umożliwiająca zliczanie liczby znaków w pliku, na przykład tekst a lub program find wyszukujący określony plik, przy czym wyszukiwanie powinno się rozpocząć od katalogu korzenia.

Ó. Sprawdź czas wykonywania powyższych poleceń uruchamianych w tle, wykorzystujac w tym celu program usługowy time.

7. Zakończ sesję przy terminalu.

•~"" <v_:

82

~ 5.5

Programowanie w języku powłoki

Rozdziai 5.

Wprowadzenie do programowania

Powłoka umożliwia konstrukcję bardziej złożonych struktur funkcji niż omówione powyżej. Utyskuje się je metodami zaliczanymi do programowania w ścisłym tego słowa znaczeniu. Są to:

• operowanie zmiennym,

• tworzenie procedur powłoki (tzw. skryptów, ang. scripts), • użycie struktur sterujących,

wykorrystywanie poleceń wewnętrznych.

Polecenia można zagnieżdżać za pomocą nawiasów okrągłych () lub grupować w nawiasy klamrowe {}. W pierwszym prrypadku:

(ciąg_poleceń)

nawiasy okrągłe służą do grupowania poleceń, które będą wykonywane jako samodzielny proces. Może to być np. proces w tle:

(ciąg_poleceń)8

Podany po prawym nawiasie okrągłym znak & lub znaki przeadresowujące wejście/wyjście są obowiązujące dla całej grupy. Stan końcowy (ang. exit status) takiej grupy poleceń jest wynikiem powstałym po wykonaniu ostatniego polecenia.

W drugim prrypadku:

{ ciąg_poleceń; }

nawiasy klamrowe służą do grupowania poleceń, które będą normalnie wykonywane. Znaki {} są traktowane przez powłokę jak polecenia, tzn. po { koniecznie musi występować spacja, a ostatnie polecenie zawarte w ciągu poleceń musi być zakończone średnikiem: Podany za prawym nawiasem klamrowym symbol potoku ~ lub znaki przeadresowujące wejście/wyjście obowiązują wszystkie polecenia zawarte w klamrach.

Nawiasy klamrowe mogą być również wykorzystane w celu oddzielenia nazwy zmiennej od innych znaków. Na przykład sekwencja poleceń

a='To jest ' echo "${a}test"

spowoduje, że na ekranie ukaże się napis: To jest test.

Ciąg poleceń zawarty w nawiasach okrągłych () będzie wykonany jako samodzielny, podrzędny proces powłoki, który powstanie przez zduplikowanie aktualnego procesu powłoki (proces podrzędny otrryma na wejściu cic~g~oleceri). Zmiany w otoczeniu nie będą więc oddziaływać na aktualny proces powłoki. Natomiast

powrox~ 83

ciąg poleceń zawarty w nawiasach klamrowych będzie wykonany przez aktualny proces powłoki. Różne efekty osiągane w wyniku zastosowania nawiasów okrągłych i klamrowych widać na poniżsrych przykładach [15]:

$ pwd /usr/studenci $ (cd /bin ; Is -la mkdir)

-cwxr--r-- 1 bin 2048 May 23 1989 mkdir $ pwd

/usr/studenci

$ { cd /bin ; Is -la mkdir; }

-rwxr--r-- 1 bin 2048 May 23 1989 mkdir $ pwd

/bin

Polecenie cd zawarte w nawiasach okrągłych nie spowodowało zmiany katalogu bieżącego, w przeciwieństwie do polecenia cd zawartego w nawiasach klamrowych.

Zmienne powłoki

. .

Nazwy zmiennych stanowią ciągi znaków zaczynające się od litery i złożone są z liter, cyfr i znaków podkreślenia. Wartościami zmiennych są łańcuchy znaków, a przypisanie wartości zmiennej jest wykonywane w następujący sposób:

nazwa zmiennej=wartość

pl'Zy CZytt7 Cli ten ptSZemy bez spacji. Jeżeli w tańcuchu wartość występują separatory

(np. spacje), to łańcuch ten należy ująć w cudzysłów. Przypisanie wartości zmiennym interpretatora csh wymaga użycia polecenia set, nie wystarcza podanie nazwy zmiennej. Wartość zmiennej oznaczana jest znakiem dolara $ poprzedzającym nazwę zmiennej. Aktualną wartość danej zmiennej możemy uzyskać stosując polecenie

echo $nazwa_zmiennej a wszystkich zmiennych poleceniem set bez argumentów.

Wartością zmiennej może być też nazwa polecenia, ponieważ jest ona łańcuchem znaków, np.:

S="sort" Użycie takiego polecenia polega na wywołaniu wartości zmiennej, tj.: $ $S

Wartością zmiennej może być na tej samej zasadzie zestaw poleceń ujętych w formie potoku.

Użytkownik może definiować własne zmienne, m. in. w celu skrócenia zapisu wprowadzanych linii poleceń, na przykład

$ katalog=/usr/student1lroboczy

84 a~ZaZrar s.

$ echo $katalog /usr/student1 /roboczy $ Is $katalog

Powłoka ma kilka zmiennych o wartościach zdefiniowanych pierwotnie. Należą do nich międry innymi zmienne PSl i PS2 (monity systemowe, inaczej znaki gotowości), HOME (nazwa katologu osobistego, tj. domyślny argument polecenia cd), PATH (zbiór katalogów przeszukiwanych przez system operacyjny w celu znalezienia programów poleceń) i inne.

Wartości zmiennych zdefiniowane pierwotnie można zmieniać. Przykładowo zamiast typowych znaków gotowości można wprowadzić nowe [7, 15]:

$ PS1=Witam

Zwróćmy uwagę, że końcem wartości zmiennej jest standardowo spacja. Jeśli użytkownik chce, aby nowo zadeklarowany znak gotowości składał się z kilku wyrazów oddzielonych znakami spacji i końcrył się dodatkowym znakiem spacji, to nadanie wartości zmiennej PS1 powinno wyglądać następująco:

$ PS1=Wprowadz' 'polecenie' '!' '

Znaki spacji zostały ujęte w znaki apostrofu, co przywraca im ich normalne znaczenie ­nie oznaczają one już wtedy końca wartości zmiennej. Przedstawioną powyżej operację można oczywiście zapisać znacznie prościej, ujmując cały tekst stanowiący wartość zmiennej w znaki cudzysłowu:

$ PS1="Wprowadz polecenie ! "

Wartość zmiennej PS2 oznacza gotowość do przyjmowania dalszego ciągu tego samego polecenia, ale w nowym wierszu.

Zmiennej HOME można nadać wartość:

$ HOME=/usr/student1/roboczy

a zmiennej PATH - wartość:

$ PATH=$HOME/procedury:/bin:/usr/bin

Przeszukiwanie katalogów przez system operacyjny po wydaniu polecenia odbywa się w kolejności określonej przez zmienną PATH (poszczególne ścieżki są oddzielone dwukropkiem). W naszym przypadku będą to następujące katalogi:

1) /usr/studentl/roboczy/procedury, 2) /bin - systemowy katalog bin,

3) /usr/bin - katalog bin użytkowników.

W ogólności zmienna PATH powinna zawierać listę katalogów, które mają być przeszukane w celu znalezienia określonego programu. Zwalnia to użytkownika z obowiązku pisania absolutnych ścieżek dostępu, gdy ma on zamiar uruchomić dany program.

Wszystkie wartości zmiennych definiowane pierwotnie można zapisać w pliku .profile, który powinien znajdować się w katalogu osobistym użytkownika. Jest on odczytywany przez powłokę podczas rejestrowania się użytkownika w systemie. Plik .profile może zawierać oprócz definicji zmiennych również inne elementy. Na przykład wprowadzenie do niego polecenia date spowoduje, że po zarejestrowaniu się

Powloka $s

użytkownika w systemie na ekranie jego terminalu będzie wyświetlana bieżąca data. Plik .profile można również wykorrystać do zmiany znaczenia klawiszy. Klawisz Backspace generuje sekwencję sygnałów Ctrl-H, natomiast klawisz Del - Ctrl-?. Jeśli użytkownik chce, aby klawiszem kasującym znaki był Del, to powinien do pliku .profile wprowadzić następujące polecenie:

stty erase ^?

Dalsze zmienne powłoki definiowane pierwotnie to tzw. parametry pozycyjne polecenia 0, ... , 9. Oprócz nich przy każdym wykonywaniu polecenia aktualizowane są zmienne ?, !, -, #, @, *. Ich wartości to:

$0 - nazwa wywoływanego polecenia lub procedury, $1- pierwszy parametr (argument) wywołania,

~2 - drugi parametr wywołania,

$9 - dziewiąty parametr wywołania,

"$*" - wszystkie parametry wywołania jako łańcuch znaków bez $0, tzn. ••$1,$2,. ."

"$@" - wszystkie parametry wywołaniajako ciąg n pojedynczych łancuchów, tzn. "$1 ", "$2", ..

$# - liczba parametrów przekazanych przy wywołaniu procedury, $- - opcje prrypisane powłoce przy wywołaniu,

$? - stan końcowy ostatnio wykonywanego polecenia, $$ - numer procesu aktualnie wykonywanej powłoki, $! - numer procesu ostatnio wykonywanego w tle.

Przypisanie wartości parametrom pozycyjnym następuje w momencie wywołania polecenia. Umożliwia to także polecenie

set łancuch7 łancuch2 ... które przypisuje parametrom $l, $2, ... nowe wartości. Pełna postać polecenia set jest następująca:

set opcje parametry

Opcje dotyczą pewnych funkcji powłoki, takich jak: pokazanie zmodyfikowanych zmiennych globalnych (-a); po przeczytaniu i wykonaniu polecenia opuszczenie powłoki (-r); zapobieżenie rozszerzaniu nazw plików w parametrach (~. Funkcji tych jest jeszcze kilka; ich opis można znaleźć w [1, 7, 11].

Zakresem ważności zmiennych jest standardowo aktualny proces powłoki. Jeżeli zakres ten ma zostać rozszerzony, to zmienna musi być przesłana do procesów podrzędnych poleceniem

export nazwa_zmiennej ...

Innymi słowy, nastąpi zadeklarowanie wyspecyfikowanych przez nazwa zmiennej zmiennych jako globalnych, to znaczy widocznych w otoczeniu. W przypadku braku nazw zmiennych w poleceniu export nastąpi wyprowadzenie nazw wszystkich zmiennych globalnych.

W dużych procedurach powłoki celowe jest usuwanie niepotrzebnych zmiennych poleceniem:

unset nazwa zmiennej

86

Rozdziaf 5.

Sesja nr 16 przy terminalu

1. Zmiennej p przypisz wartość pwd. Wykorzystaj tę zmienna zamiast polecenia pwd. W ten sam sposób spróbuj zastąpić pewne polecenia systemu UNIX odpowiadającymi im poleceniami systemu MS DOS, np. zastąp Is -la przez dir itp.

2. Wykorzystując polecenie echo sprawdź wartość zmiennej HOME i PATH.

3. Sprawdź, jaki będzie rezultat działania polecenia echo $HOME i polecenia echo $$HOME.

4. Utwórz zmienną katalog i nadaj jej wartość równą usrlstudenłsl studentllroboczy. Wykorzystaj tę zmiennąw poleceniu cd.

5. Zmień wartość zmiennej PS1 zdefiniowanej pierwotnie na: Czekam na polecenie !

Ó. Spróbuj odczytać i przejrzeć plik .profile.

7. Zmień katalog bieżący na teksty. Wykorzystując polecenie echo sprawdź wartości parametrów pozycyjnych $0, $1 i $2, a następnie S# oraz sprawdź stan końcowy ostatnio wykonywanego polecenia ($?).

8. Zakończ sesję przy terminalu.

Procedury powłoki

Zestaw poleceń powłoki można traktować jako język programowania powłoki. Ciągi poleceń powłoki są programami, gdyż opisują ciągi akcji do wykonania. Ciągi te można zapisać w plikach; nazywają się one wówczas procedurami lub scenariuszami powłoki, lub skryptami. Plik zawierający ciąg poleceń wykonuje się przez uruchomienie nowego procesu powłoki i przekazanie mu tego pliku jako danych wejściowych:

lub

$ sh procedura

$ sh <procedura

Wygodniejsrym jednakże sposobem korzystania z takich plików jest przekształcenie ich w samodzielne polecenia. Należy zmienić dany plik tekstowy w plik, który ma nadane prawa wykonywania, np. polecenie

$ chmod a+x procedura

Powloka 87

spowoduje przyznanie wsrystkim użytkownikom prawa wykonywania pliku procedura, który od tej chwili będzie już poleceniem. W rzeczywistości plik procedura będzie uznany przez jądro systemu operacyjnego za polecenie niepoprawne, gdyż jego zawartość nie odpowiada wymaganiom stawianym programom w postaci wynikowej. Wówczas powłoka podejmie próbę ich interpretacji. Tak więc pliki zwykłe z uprawnieniami do wykonywania, nie zawierające kodu wynikowego programów, traktuje się jako procedury powłoki.

W najprostszej postaci procedura powłoki może zawierać jedno lub kilka poleceń, lub potok. Na przykład chcąc zastąpić polecenie ls -la jego odpowiednikiem z systemu DOS, można utworzyć plik o nazwie dir, którego jedyną zawartością będzie Is -la, i następnie nadać mu prawo wykonywania. W podobny sposób można skonstruować procedurę o nazwie np. potok I, zawierającą:

$ grep 'systemy operacyjne' pracownicy_1 ~sort -b +1 -3 -o kto so Każdorazowe uruchomienie procedury potoki spowoduje wykonanie programów grep i sort w podanej wyżej postaci.

Procedury mogą zawierać parametry symboliczne, którym nadaje się odpowiednie wartości w chwili interpretowania i wykonywania. Tymi parametrami mogą być omówione wcześniej zmienne powłoki, tzw. parametry pozycyjne. Oznacza to, że we wnętrzu procedury można użyć do dziewięciu symboli specjalnych, składających się ze znaku dolara i cyfry (fil, X2,...,$9), w celu zastąpienia nimi dowolnych ciągów znaków. Podczas wywoływania procedury należy podać odpowiednią liczbę nazw plików, wartości liczbowych i innych faktycznych argumentów w postaci ciągów znaków. Powłoka podstawia je w miejsce kolejnych parametrów symbolicznych, pierwszy w miejsce parametru $I, drugi w miejsce ~2 itd.

Omówione powyżej parametry symboliczne można wykorzystać do sparametryzowania procedury potok_l. Aby stworryć możliwość zmiany ,wzorca przeszukiwania i nazwy pliku w programie grep oraz nazwy pliku wynikowego dla programu sort, procedurę potok I należy zmodyfikować z wykorzystaniem odpowiednich zmiennych pozycyjnych:

$ grep $1 $2 ~ sort -b +1 -3 -o $3

Przykładowe wywołanie tej procedury może wówczas wyglądać następująco:

$ potok_1 'bazy danych' pracownicy_2 wyniki

Podczas tego wywołania poszczególne zmienne pozycyjne przyjmują następujące wartości:

,~0 - potoki

,fil - 'ha-y dartych' ~2 - pracownicy 2 ,~3 - wyniki

88 Rozdziaf 5.

5:5.4

Wykorzystywanie struktur sterujących

W jęryku poleceń powłoki każdemu poleceniu po jego wykonaniu prrypisuje się atrybut zwany kodem zakończenia lub inaczej stanem końcowym (ang. Exit Status). Jest to wartość logiczna, informująca o powodzeniu (wartość TRLJE) lub niepowodaeniu (wartość FALSE) w czasie wykonywania polecenia. Na przykład, jeśli chcemy wykonać polecenie rm, a podany plik nie istnieje, to oczywiście nie można go usunąć i próba wykonania polecenia nie powiedzie się. Kod zakończenia ma wówczas wartość "niepowodzenie". Powłoka potrafi sprawdzić wartość kodu i w zależności od wyniku podejmować wykonywanie dalszych operacji z wykorzystaniem odpowiednich struktur sterujących.

Za pomocą kodu zakończenia jako warunku można tworzyć następujące konstrukcje:

1) koniunkcję warunkową, symbolizowaną podwójnym znakiem &&:

polecenie_1 8~8~ polecenie_2

która polega na wykonywaniu polecenia_2 tylko wtedy, gdy kod zakończenia polecenia_1 ma wartość TRUE, tzn. gdy wykonanie polecenia_I zakończy się powodzeniem;

2) alternatywę warunkową, symbolizowaną dwoma belkami

polecenie_1 ; ; polecenie_2

która polega na wykonywaniu polecenią 2 tylko wtedy, gdy wykonanie polecenie_1 zakończy się niepowodzeniem.

Stanem końcowym koniunkcji i alternatywy warunkowej jest stan końcowy ostatnio wykonywanego polecenia. Stan końcowy koniunkcji ma wartość TRUE, jeżeli obydwa polecenia kończą się powodzeniem, natomiast stan końcowy alternatywy ma wartość TRUE, jeżeli jedno z poleceń zakończy się powodzeniem.

Podstawą tworzenia struktur sterujących w procedurach powłoki są jednak klauzule znane z języków programowania wysokiego poziomu, takie jak: if ...then ...else, case.

Istnieją dwie postacie klauzuli if, a mianowicie: if ...then oraz if ...then ...else. Jak łatwo zauważyć, polecenie warunkowe if bez frazy else jest równoważne koniunkcji warunkowej, na przykład:

if rm plik_1

then rm plik 2; echo "Usunieto pliki: plik_1 i plik 2" else echo "Nie istnieje plik: plik_1";

fi

Wynikiem tego ciągu poleceń ma być usunięcie pliku plik I i jeśli to się powiedzie, to również pliku plik2 i wypisanie na ekranie odpowiedniej informacji; w przeciwnym razie (else) powinna być wypisana informacja o niepowodzeniu. Symbol fi oznacza koniec klauzuli warunkowej.

Powfoka

ROZwaŻmy prZykład)eSZCZe innej procedury której podstawowym elementem ic.,-r IIIStl21iCCJ8 If DO 80tOm81yczne~yo uyto~ is .ero p7x f~ ~cto~zucrrra l cdj~Gfi pliku

źródłowego w języku C można wykorzyStaG ~cnc2~durę tcattl~ C . ~~W0~~11~ ~, parametrem, tl. nazw~pliku źródlowego (bez rozszerzenia), który ma być przetwarzany, wywołuje kompilator języka C - cc. Jeżeli nie został utworzony plik wynikowy (n rozszerzeniu out) - co znaczy, że podczas kompilacji wykryto błędy - t~~ wzywany jest edytor vi. W przeciwnym wypadku jest uruchamiany program wynikow;

if test -r $1.out then rm $1.out fi

cc $1.c

if test -r $1.out

then echo "plik zostal skomplikowany poprawnie" echo "uruchamiam program"

$1.out else echo "przykro mi, w pliku sa biedy" vi $1.c

fi

Do podejmowania decyzji wewnątrz procedur bardzo często wykorzystuje się polecenie test. Działanie tego polecenia polega na wyliczeniu wartości logicznej wyrażenia będącego argumentem i podania jej jako kodu zakończenia. Składnikami wyrażenia warunkowego mogą być nazwy plików, ciągi znaków i liczby całkowite. Składnik, w którym należy zbadać nazwę pliku, ma zazwyczaj następującą postać jednoliterowa opcja określająca warunek i nazwa pliku występująca po niej.

Najważniejsze z tych opcji to:

-r nazwa pliku można czytać z pliku, -w nazwa pliku można pisać w pliku,

-x nazwa plika można wykonywać plik, tekstl = tekst2 oba teksty są identyczne, tekst tekst istnieje.

DO porównania I1CZb mOŻria UŻyWaĆ tóżnyeh operatorów, oznaczonych sktótarni zapożyczonymi z języki FOllldl7, Ilp.

liczbal -eg liczba2 - obie liczby mają tę samą wartość. Sąto następujące operatory'.

- gt ( greater than - większe),

- ge (greater tharr or equal to - większe lub równe), - eq (equal to - równe),

- ne (not equal - nierówne),

r - ft (tess than - mniejsze niż),

- le (less than or egoal to - mniejsze lub równe).

W każdym przypadku, jeśli warunek jest spełniony, wynikiem będzie powodzenie W wyrażeniach logicznych wolno używać następujących spójników logicznych: (negacja),

-a (and, -koniunkcja),

Rozdział S.

-o (or, -alternatywa) oraz nawiasów.

Na prrykład polecenie

$ test -f plik -a -w plik

sprawdza, czy plik jest plikiem zwykłym i czy użytkownikowi przyznano prawo pisania w nim.

Argumentami wchodzącymi w skład wyrażeń logicznych mogą być parametry symboliczne. Rozważmy procedurę [7] vibak, która ma uruchomić edytor vi, zachowując równocześnie oryginał poprawianego pliku. Parametrem procedury jest nazwa pliku, a polecenie

$ vibak plik

powinno umożliwić poprawienie pliku, poprzedzone utworzeniem archiwalnego pliku plik.bak. Procedura ta może być następująca:

if test $1

then if test -w $1 -a -f $1 then cp $1 $1.bak fi

vi $1

else echo "Musisz podac nazwe pliku" fi

W pierwszym wierszu procedury sprawdza się, czy w ogóle został podany argument prry wywołaniu procedury. Jeśli nie, to następuje wyświetlenie komunikatu "Musisz podac nazwe pliku" i zakończenie pracy. Jeśli natomiast nazwa pliku została podana i jest to plik zwykły z prawem pisania, tworzona jest jego kopia z prawem pisania. Nazwa kopii składa się z nazwy oryginału i przyrostka .bak (w miejsce symbolu $I podstawia się ciąg znaków podany jako parametr przy wywołaniu procedury, a więc symbol $l.bak oznacza ten sam ciąg znaków, ale z dołączonym przyrostkiem).

Można pominąć nazwę polecenia test, wystarczy ująć w nawiasy kwadratowe sformułowany warunek, poprzedzony i zakończony spacją.

Instrukcja wyboru case pozwala na wielokrotne rozgałęzienie. Ma ono następującą postać:

case wartość in

wartość 1) lista~oleceń;;

wartoś n) lista~oleceń;;

*) lista~oieceń;; esac

Łańcuch wartość będzie kolejno porównywany z wzorami wartość_I, wartość_2 itd. i po napotkaniu pierwszego wzoru zgodnego z łańcuchem wartość wykonywana jest następująca po wzorze lista~oleceń. Przed prawym nawiasem okrągłym może wystąpić więcej wzorów wartości oddzielonych od siebie znakami belki 2, oznaczającej w tym przypadku alternatywę:

wartość 1 ; wartość_2 ...) lista~oleceń

Powłoka 91

W sekwencji *) lista-poleceń można podać listę poleceń, które będą wykonywane, jeżeli żaden z poprzedzających wzorów nie był zgodny z łańcuchem wartość. Jako przykład użycia instrukcji case przytaczana jest często w literaturze [7, 11] procedura append, dołączania pliku do pliku:

case $# in

1) cat »$1;;

2) cat »$2 <$1;;

*) echo "Biedne uzycie procedury" esac

Użycie procedury append może mieć następującą postać:

$ append pfik_1 lub

$ append plik 1 plik 2

W pierwszym wypadku, ponieważ występuje tylko jeden argument, zmienna $# przybiera wartość 1 i wykonywana jest pierwsza ewentualność polecenia case, tj. cat »pliki, a więc zapisanie informacji do pliku plik_I. W drugim wypadku występują dwa argumenty plik I i plik 2, a więc wartość zmiennej ~# wynosi 2 i wykonywana jest druga ewentualność polecenia case. Podanie każdej innej liczby argumentów powoduje wykonanie ewentualności oznaczonej gwiazdką """.

W powłoce standardowej Bourne-Shell instrukcje iteracyjne (pętle) występują w trzech odmianach:

instrukcja for, której treść jest wykonywana jednorazowo dla każdego słowa na liście słów,

• instrukcja while, której treść wykonywana jest tak długo, jak długo spełniony jest warunek w while,

• instrukcja umil, której treść wykonywana jest tak długo, aż nastąpi spełnienie warunku w until.

Możliwe jest stosowanie w wyżej wymienionych instrukcjach iteracyjnych poleceń powłoki continue i break. Polecenie continue umożliwia pominięcie reszty treści iteracji i ponowne sprawdzenie warunku pętli, a polecenie break - opuszczenie pętli i dalsze przetwarzanie (po słowie done). Oba polecenia można wywoływać z opcjonalnym parametrem n, pozwalającym na opuszczenie n zagnieżdżonych iteracji.

Instrukcja for w postaci:

for nazwa do

lista~oleceń

done pozwala na wielokrotne powtarzanie listy poleceń, przy czym zmiennej na~s~a przypisywane są kolejno wartości parametrów pozycyjnych od ~/ do orz Instrukcja for może występować również w nieco innej postaci:

92

for nazwa in wartości do

lista~oleceń

RoZaZraf s.

done Powoduje ona, że zmiennej nazwa prrypisywane są kolejno wartości, a lista

poleceń jest wykonywana tylokrotnie, ile jest słów na pozycji wartości. Jako przykład rozważmy procedurę wykonującą zmianę praw dostępu do wszystkich plików z katalogu bieżącego:

for i in 'Is' do chmod a+x $i

done

Polecenie Is dostarcza nazw plików znajdujących się w katalogu bieżącym; są one następnie podstawiane w miejsce parameru ~i w poleceniu chmod. Działania te są powtarzane tak długo, aż lista nazw plików uzyskana jako wynik działania polecenia Is nie zostanie wyczerpana.

Instrukcja while w postaci:

while lista~oleceń_1 do lista~oleceń_2 done

powoduje wykonanie listy-poleceń-1. Jeżeli jej rezultatem będzie 0, to wykonywana będzie lista poleceni 2. Działania te będą wykonywane tak długo, aż wykonanie listypolece~i l dostarczy wynik różny od zera. W tym przypadku następuje wyjście z pętli i przetwarzanie będzie kontynuowane po instrukcji done.

Instrukcja until w postaci:

u nti I lista~oleceń_ 7

do lista~oleceń_2 done

powoduje wykonanie listy poleceń zapisanej jako lista-poleceni _', jeśli lista~oleceo-I dostarcza rezultatu różnego od zera.

Przykład stosunkowo dużego programu zawierającego omówione powyżej elementy języka programowania powłoki systemu UNIX zaprezentowano w dodatku B. Program ten kasuje wszystkie pliki i podkatalogi w katalogu wskazanym w jego wywołaniu.

Powfo~ 93

Funkcje wewnętrzne powłoki

Funkcje wykonywane wewnętrznie przez powłokę i nie prowadzące do utworzenia nowego procesu, są nazywane poleceniami wbudowanymi powłoki [7]. Część z nich została omówiona już wcześniej. Obecnie omówimy polecenia wbudowane najczęściej wykorzystywane w procesie konstruowania procedur powłoki. Są to następujące funkcje wewnętrzne:

tekst Polecenie puste zwracające zawsze wartość zero (0). Reszta linii po dwukropku i spacji jest ignorowana i może być wykorrystana jako początek jednowierszowego komentarza.

# tekst

Wiersz komentarza. . plik

Polecenie kropka (.) powoduje czytanie i wykonywanie poleceń z pliku, a następnie powrót do miejsca wywołania.

break n

Opuszczenie otaczającej pętli for, while lub until; opcjonalne n specyfikuje liczbę zagnieżdżeń pętli, które należy opuścić. Przetwarzanie kontynuowane będzie po słowie dongi.

continue n

Skok do początku pętli for, while iub umil i ponowne sprawdzenie warunku pętli (reszta pętli aż do jej końca zostaje pominięta). Opcjonalne n podaje głębokość zagnieżdżenia.

read name ...

Wczytanie wiersza z wejścia standardowego i przypisanie zawartych tam słów wyspecyfikowanym zmiennym powłoki. Jeżeli wiersz zawiera więcej słów niż liczba zmiennych, to ostatnia zmienna będzie zawierać resztę wiersza.

readonly name ...

Zadeklarowanie wyspecyfikowanych zmiennych powłoki jako stałych, których wartości nie można zmieniać. Jeżeli nie są wyspecyfikowane zmienne, nastąpi wyprowadzenie nazw wsrystkich zmiennych powłoki.

return wartość

Końcry aktualną procedurę i przekazuje wartość jako stan końcowy do procedury lub powłoki wywołującej. Jeźeli wartość nie została podana, to przekazywany jest stan końcowy ostatnio wykonanego polecenia.

shift n

Przesunięcie parametrów pozycyjnych o jedną lub rr pozycji. W ten sposób 5l otrzyma wartość S2, S2 wartość S3 itd.

94 Rozdział S.

umask n

Ustalenie praw dostępu do nowo tworzonych plików. Prawa podawane przez n są liczbą ósemkową. Jeżeli nie jest podana wartość n, to nastąpi wyprowadzenie aktualnych praw dostępu. Bity ustawione na jeden "1" oznaczają, że dane prawo nie ma być udzielone (odwrotnie niż chmod!), np. polecenie umask 111 spowoduje, że każdy nowo tworzony plik będzie miał prawa dostępu -rw-rw-rw-. Polecenie umask 122 ustali prawa dostępu na -rw-r--r--. Polecenia umask z wartością ósemkową 2 i większą na najstarszej pozycji, np. umask 200 lub umask 777, nie pozwolą na utworzenie pliku edytorem vi i przy podjęciu takiej próby wyświetlony zostanie komunikat: Permission denied - brak pozwolenia. Polecenie umask 111 spowoduje, że wykonana po nim kompilacja danego pliku źródłowego utworry plik wynikowy mający prawa dostępu -rw-rw-rw-. Próba wykonania programu zawartego w tym pliku zakońcry się niepowodzeniem - o crym informuje komunikat "execute permission denied" - brak pozwolenia na wykonanie. Standardowe prawa dostępu do pliku mają postać 077. Prawa te obowiązują prry rozpoczęciu sesji z terminalu, to znaczy każde zakończenie sesji powoduje powrót do standardowych praw dostępu. Na przykład plik tworzony edytorem vi będzie miał wtedy prawa dostępu: -rw-------.

clear

Czyszczenie ekranu terminalu. Polecenie to korzysta z informacji na temat terminalu zawartych w pliku terminali.

Sesja nr 17 przy terminalu

Napisz i przetestuj procedurę uruchamianą po zarejestrowaniu się użytkownika w systemie, która będzie realizować następuj~,ce czynności:

sprawdzać, czy nadeszła poczta do użytkownika (mail z odpowiednia opcji; jeśli tak, to przesyłkę należy wpisać do pliku i następnie spytać użytkownika, czy życzy sobie jej wyświetlenia. Jeśli użytkownik chce, aby przesyłka była wyświetlona, powinien wcisnąć klawisz "t"; do wyświetlenia przesyłki należy wykorzystać potok składajacy się z poleceń cat i moce;

wprowadzać na ekran po 20 sekundach pytanie "Czy skonczyles czyłac poczte ?"; pytanie to powinno się pokazywać cyklicznie aż do momentu, gdy użytkownik udzieli odpowiedzi "t"

sprawdzać, ilu użytkowników pracuje w systemie (polecenie Is, grep i wc z odpowiednimi opcjami) i informować o tym użytkownika, deklarować katalog bieżacy; na ekranie powinno pojawić się

pytanie: "W ktorym katalogu zamierzasz pracowac najczesciej podczas tej sesji ?"; odpowiedź powinna być podstawiona pod zmienną katalog, a użytkownik poinformowany o tym, że może tę zmienna wykorzystywać w czasie sesji w poleceniu cd.



Wyszukiwarka

Podobne podstrony:
System operacyjny UNIX dla poczatkujacych i zaawansowanych, rozdzial1 i2
System operacyjny UNIX dla poczatkujacych i zaawansowanych, rozdzial3
System operacyjny UNIX dla poczatkujacych i zaawansowanych, rozdzial8 i reszta
System operacyjny UNIX dla poczatkujacych i zaawansowanych, rozdzial6
System operacyjny UNIX dla poczatkujacych i zaawansowanych, podsumowanie
System operacyjny UNIX dla poczatkujacych i zaawansowanych, skorowidz
Strzelecki - kolos-wejściówka -pytania i odp, WAT, semestr VI, systemy operacyjne UNIX
Pierwsza wersja systemu operacyjnego Unix powstała w Bell Labs firmy AT
Pierwsza wersja systemu operacyjnego Unix powstała w Bell Labs firmy AT
Solaris pytania 02, WAT, semestr VI, systemy operacyjne UNIX
Systemy operacyjne unix polecenia podstawowe
Przepisy z wołowiny dla początkujących i zaawansowanych
System operacyjny UNIX

więcej podobnych podstron