351
Bartók Nagy János Laufer Judit UNIX felhasználói ismeretek

unix kézkönyv

Embed Size (px)

Citation preview

Page 1: unix kézkönyv

Bartók Nagy János Laufer Judit

UNIX felhasználói ismeretek

Page 2: unix kézkönyv

Bartók Nagy János Laufer Judit

UNIX FELHASZNÁLÓI

ISMERETEK

Openinfo Kiadó

Page 3: unix kézkönyv

Az MTA SZTAKI UNIX Oktatóközpont tanfolyamanyagainak felhasználásával írta: Bartók Nagy János és Laufer Judit

Lektorálta:

Dr. Demetrovics Katalin Ivanyos Gábor

Singer Péter

Az Openinfo Könyvek sorozatszerkesztõje: Dr. Hutter Ottó

PDF formátumra átkonvertálta:

Veres Miklós

ISBN 963 85139 0 X ISSN 1217-8608

A UNIX Számítógépes Kultúra Elterjesztéséért Alapítvány támogatásával készült.

A számítógépes szövegszerkesztés a Scriptum Kft. munkája. A nyomást és a kötést az Akadémiai Kiadó és Nyomda Vállalat készítette.

Forgalmazók:

Scriptum Kft. 6771 Szeged Mályva u. 34.

Tel.: (62) 406-133 Fax: (62) 405-722

OpenInfo Kft. 1111 Budapest Kende u. 13-17. Tel.: 186-8760 Fax: 166-7503

Page 4: unix kézkönyv
Page 5: unix kézkönyv

5

TARTALOMJEGYZÉK 1. BEVEZETÉS 19

A UNIX kialakulása 19 Mi is a UNIX? A rendszer felépítése 23 UNIX dokumentációk 24

Kézikönyvek 24 On-line help 28

2. ALAPFOGALMAK 30

Többfeladatos-többfelhasználós mûködés 30 Bekapcsolás-belépés-kilépés-kikapcsolás 31 Bejelentkezési nevek és kulcsszavak 32 Normál és privilégizált felhasználók 32 Terminálelérés: soros vonali és hálózati és rendszerterminálok 33 Folyamatkezelés: elõtér- és háttérfolyamatok, démonok és jobok 34

Programok és folyamatok 34 Háttérfolyamatok és démonok 35

A parancsértelmezõ 36 A shell mint programozási nyelv 37 A „szerszámosláda” és a „deszkapados modell” 37 Különbözõ shellek 37

A fájlrendszer: Fájlok és katalógusok, névkonvenciók 38 Felhasználói- és csoportazonosítók 39

Hozzáférési jogok és végrehajtható fájlok 40

3. ISMERKEDÉS AZ ÁLLOMÁNYRENDSZERREL 41

Bejelentkezés 41 A fájlrendszert kezelõ parancsok 43

A fájlrendszer kitüntetett pontjai 44 Hol vagyunk? A pwd parancs 44 Mit láthatunk? Az ls parancs 45 Hová jutunk? A cd parancs 46 Minek nevezzelek? Névkonvenciók 47

Page 6: unix kézkönyv

UNIX felhasználói ismeretek

6

Rejtett fájlok 48 Katalógusok létrehozása: a mkdir parancs 48 Katalógusok törlése: az rmdir parancs 49

Alapvetõ fájlkezelõ parancsok 49 Fájlok létrehozása 50 Fájlok megtekintése: a cat parancs 51 Fájlok átnevezése: a mv parancs 52 Fájlok másolása: a cp parancs 53 Fájlok törlése: az rm parancs 53 Láncok létrehozása: az ln parancs 53 A szimbolikus lánc 53

Hozzáférési jogosultságok 57 Hozzáférési jogosultságok módosítása: a chmod parancs 60 Tulajdonos- és csoportváltás: chown és chgrp 61

Másodlagos csoportok 63 Gyakorlati példa: a passwd program 63

Mi hol található a UNIX-ban? Állománykonvenciók 65

4. A PARANCSÉRTELMEZÕ (BOURNE SHELL) 67

Speciális karakterek 67 A vezérlõkarakterekrõl 67 Karaktertörlés 68 Sortörlés 68 Speciális jelentés elnyomása 68 Programfutás megállítása 69 Háttérben futó programok megállítása 69 Fájlvége 69 Képernyõlistázás 70

A parancssor feldolgozása 70 Több parancs egy sorban 71 A standard perifériák és átirányításuk 72 A csõvezeték (pipe) 74 Programok csoportosítása zárójelezéssel 76 A standard error 76

Csövek elágaztatása: a tee parancs 77 Folyamatkezelés 77

Háttérfolyamatok és folyamatazonosítók 77 Folyamatok lelövése: a kill parancs 78 Folyamatok kilistázása: a ps parancs 78 Programfuttatás kilépés után: a nohup parancs 79 Programok idõzített végrehajtása: az at parancs 79

A fájlnevek behelyettesítése a shell-ben 81 A DOS és UNIX metakarakterek 83

Metakarakterek semlegesítése 83

Page 7: unix kézkönyv

Tartalomjegyzék

7

Megjegyzések 84 Shell-scriptek 85 Programargumentumok, shell változók 86

A rendszer által állított fontosabb shell-változók 88 Shell-változók exportja 89 Pozicionális paraméterek 90 Paraméterbehelyettesítés 91

Parancsbehelyettesítés 92 Környezetalakítás: a profile fájlok 92

5. REGULÁRIS KIFEJEZÉSEK 94

6. AZ ED EDITOR 97

A UNIX szövegszerkesztõirõl általában 97 Az ed 97 Mûködési alapelvek 97 Az ed parancsainak alakja 98 Az ed szövegszerkesztõ parancsai 100

Néhány példa az ed szövegszerkesztõ használatára 102

7. A SED EDITOR 105

A sed mûködési elve 106 Címzés a sed-ben 107 A sed fontosabb parancsai 108

Behelyettesítés 108 Törlés 110 Hozzáfûzés, beszúrás, változtatás 110 Transzformáció 110 Nyomtatás 111 Új sor beolvasása 111 Fájlok írása–olvasása 111 Több sor kezelése 113 Az ideiglenes tárolótér és parancsai 114 Elágazások, feltételes parancsvégrehajtás 114

8. A VI EDITOR 117

A vi mûködése, üzemmódjai 118 Ismerkedés – a túlélõkészlet 119 Pozicionáló parancsok 121

Page 8: unix kézkönyv

UNIX felhasználói ismeretek

8

Szavak, mondatok és egyéb szövegelemek 121 A vi parancsok felépítése 122

Pozicionálás karakterek alapján 123 Pozicionálás sorok alapján 123 Pozicionálás szavak alapján 123 Pozicionálás mondatok alapján 123 Pozicionálás bekezdések alapján 124 Pozicionálás a képernyõn 124 Pozicionálás az állományban – görgetés 124 Pozicionálás sorszám alapján 124 Pozicionálás mintakereséssel 124

Szövegbeviteli parancsok 125 Szövegmódosító (cserélõ) parancsok 125 Törlõ parancsok 126

Törlés parancsmódban 126 Törlés beviteli módban 126

Állományváltás és mentés 126 Speciális parancsok 127 Jelzõpontok (markerek) 128 Pufferkezelés 128

Névtelen és nevezített pufferek 128 Szövegmásolás: p és y parancs 129 Vágás-ragasztás 130

Fájlmûveletek és külsõ shell parancsok 130 Külsõ parancs végrehajtása vi alól 130 Fájlok írása-olvasása 131 Puffermûveletek 131

Komplex keresések és behelyettesítések 132 Rövidítések és makrók 133 A vi konfigurálása 134

A :set parancs és a vi belsõ változói 134 A vi és ex konfigurációs fájljai 135

Az editorok összehasonlítása 135

9. SEGÉDPROGRAMOK 136

Visszatérési érték 137 Szûrõk 137 Állományok rendezése 137 Mintakeresés állományokban 139 Állományok összehasonlítása 142 Állománylistázó („dump”) parancsok 145 Karakterkonverzió 146 Állománykeresés 147 Adatbeviteli parancsok 148

Page 9: unix kézkönyv

Tartalomjegyzék

9

Aritmetikai kifejezéseket kezelõ parancsok 149 Kommunikációs parancsok 151 Egyéb hasznos UNIX utility-k 153

10. SHELL PROGRAMOZÁS 154

A shell komplex átirányítási funkciói 154 Beágyazott input (here documents) 154 Vezérlési szerkezetek a shell-ben 156 Elágazások 156

Az if elágazási mechanizmus 156 A case elágazási mechanizmus 157

Ciklusok 158 A for ciklus 158 A while és az until ciklus 158

Példaprogramok 160 2, 3, 4, ...: többhasábos nyomtatás 160 bell: adott számú terminál hangjelzés 161 exch: állományok cseréje 162 same_nm: azonos nevû állományok keresése 163 updt: frissen módosított állományok listázása 164 bundle: programcsomagok tömörítése és kibontása 166

11. A C SHELL 170

A C shell indítása 170 Kilépés a C shellbõl 170 A C shell konfigurációs fájljai 171

A .cshrc konfigurációs fájl 171 A .login konfigurációs fájl 172 A .logout konfigurációs fájl 172

Metakarakterek semlegesítése 174 Szintaktikus metakarakterek 174 Automatikus fájlnév kiegészítés 175 Parancsszerkesztési lehetõségek a C shell-ben 175

Parancshistória megtekintése 176 Parancsok ismételt végrehajtása 176

Hivatkozás az esemény sorszámával 176 Hivatkozás az esemény relatív elhelyezkedésével 177 Hivatkozás az esemény szövegével 177

Parancs argumentumok újra felhasználása 178 Elõzõ események módosítása 179

Az alias mechanizmus 181 Az alias behelyettesítés 182

Page 10: unix kézkönyv

UNIX felhasználói ismeretek

10

Alias törlése 183 Átirányítások 183 Shell-változók 186

Értékadás és hivatkozás változókra 186 Numerikus shell-változók és kifejezések 187 Változóbehelyettesítés 188 Környezeti- és shell-változók a C shell-ben 189 A C shell belsõ változói 191

Parancsbehelyettesítés 193 Fájlnév behelyettesítés 194 Kifejezések és operátorok 195

Aritmetikai operátorok 195 Logikai (relációs) operátorok 195 Értékadási operátorok 196 Postfix operátorok 196 Fájl- és parancs-teszt operátorok 196

Vezérlési szerkezetek 197 if-then-endif 197 switch 198 foreach 199 while 199 goto 199

A parancsvégrehajtás folyamata 200 Jobkezelés 201 A C shell beépített parancsai 202

12. A KORN SHELL 209

Indítás és kilépés a Korn shell-bõl 209 Konfigurációs fájl- és shell-változók 210 A shell opcióinak beállítása 211 A shell, mint parancsértelmezõ tulajdonságai 213

Kétirányú csõhálózat 213 Állománynév kiegészítések 214 Tilde jel behelyettesítése 215 Változók és a paraméter helyettesítések 216 Utasítások behelyettesítése 219 Alias-ok és függvények 220 Egész aritmetika 222 A job fogalma 223 Az utasítássor editálása, history használata 223

13. AMI KIMARADT... 226

Terminálkezelés 226 Az stty parancs 226

Page 11: unix kézkönyv

Tartalomjegyzék

11

Kontroll beállítások 228 Input beállítások 228 Output beállítások 229 Lokális beállítások 229 Vezérlõkarakter beállítások 230 Kombinált beállítások 231 Eltérés az SVR4 és BSD stty között 231 Terminálproblémák kezelése 232

A tput parancs 233 Nyomtatás 234

SVR4 rendszerek 234 Az lp parancs 235 A cancel parancs 237 Az lpstat parancs 238

BSD rendszerek 239 Az lpr parancs 239 Az lpq parancs 240 Az lprm parancs 241

Archiválás, mentés 241 A cpio parancs 241 A tar parancs 243 A dd parancs 245

DOS alapú fájlok és lemezek kezelése 246 DOS konverziós segédprogramok 247

FÜGGELÉKEK 248

Permutált index 248 Mini manuál 253 Hibakeresés, tippek és trükkök 294 Feladatgyûjtemény 306

TÁRGYMUTATÓ 347

Page 12: unix kézkönyv
Page 13: unix kézkönyv

15

ELÕSZÓ Könyvünk az MTA SZTAKI Unix Oktatóközpontja tanfolyamainak anyagára támaszkodva készült. Megírásakor kételyek merültek fel bennünk, vajon érdemes-e újabb UNIX könyvet írni, amikor a könyvpiac tele van a Unixot tárgyaló könyvekkel, s ezek közül a Kernighan-Pike páros nélkülözhetetlen alapmûve, „A UNIX operációs rendszer” magyarul is hozzáférhetõ. Mégis a megírás mellett döntöttünk, egyrészrõl mert a Kernighan-Pike könyv elég régen íródott, s azóta a Unix is jelentõs fejlõdésen ment át, másfelõl számos témával e könyvek nem foglalkoznak, illetve csak egyegy részterületben mélyednek el, sajnálatosan kevés hangsúlyt fektetve a mindennapi életben rendszeresen felmerülõ problémákra.

A fent leírtak szellemében szerepel könyvünkben a vi és a sed editor ismertetése éppúgy, mint a C és a Korn shellek, amelyekrõl ismereteink szerint egyáltalán nincs hozzáférhetõ magyar nyelvû irodalom.

Igyekeztünk a még tapasztalatlan felhasználó hányattatásait enyhíteni, éppen ezért külön fejezetben foglalkozunk a mindennapi munka során elõkerülõ, gyakran a rendszeradminisztráció határterületeinek minõsíthetõ komplex tevékenységekkel (mentés, nyomtatás, kommunikáció stb).

Elsõsorban a kezdõ, és az angolban nem járatos felhasználó veheti nagy hasznát a magyar nyelvû parancs-referencia résznek, és az ennek használatát megkönnyítõ permutált indexnek.

A „Hibakeresés, tippek és trükkök” címû fejezetben a leggyakoribb hibahelyzeteket, és ezek kezelését foglaljuk össze saját tapasztalataink alapján.

Könyvünk másik erõsségének szántuk a gazdag feladatgyûjteményt, amely lehetõség szerint minden fontosabb területet érint. Az itt szereplõ feladatok megoldásával az olvasó reményünk szerint kellõ ismereteket fog szerezni ahhoz, hogy biztonsággal és értõ módon dolgozhasson, tetszõleges Unix rendszer alatt.

Könyvünk megírásánál a lehetõség szerint maximálisan megpróbáltunk platform- és verziósemlegesek maradni, ami egyáltalán nem bizonyult könnyû feladatnak. A könyv mondanivalójának többsége egyetemlegesen igaz a különbözõ Unix verziókra, az olyan részeknél, ahol jelentõs eltérések mutatkoznak az egyes Unix verziók között, erre mindig utalunk a szövegben.

Végezetül szeretnénk köszönetet mondani mindazoknak, akik megjegyzéseikkel és tanácsaikkal segítették e könyv megszületését; a Kedves Olvasót pedig arra kérjük, a könyvvel kapcsolatos megjegyzéseit, javaslatait, netán másokkal megosztásra érdemes tapasztalatait juttassa el a kiadónak, hogy az újabb kiadások mindannyiunk javára gazdagodhassanak.

Page 14: unix kézkönyv

UNIX felhasználói ismeretek

16

Budapest, 1994

A Szerzõk

Page 15: unix kézkönyv

Tartalomjegyzék

17

ELÕSZÓ A MÁSODIK KIADÁSHOZ

Öt utánnyomás után, végre átdolgozva adjuk az Olvasó kezébe könyvünk második kiadását, abban a reményben, hogy a Unix operációs rendszerrel ismerkedoknek ezután is sok hasznos információt fog nyújtani. Iparkodtunk az elso kiadásban fellelheto hibákat gyökerestül kiirtani, bár nem ringatjuk magunkat abban a hiú reményben, hogy ez ne lett volna újabb hibák melegágya... A nyilvánvaló sajtóhibákon és kisebb korrekciókon túlmenoleg teljesen átdolgoztuk a sed és a vi editorokról szóló fejezetet, szándékunk szerint most gyakorlatiasabb, ugyanakkor teljesebb leírást kap kezébe az olvasó. Szintén teljesen átdolgoztuk a tárgymutatót, de ami a legfontosabb, könyvünk immár megpróbálja tükrözni az elozo kiadás óta bekövetkezett változásokat, s ahol csak lehetett, a Unix'95 szabványokhoz igazítottuk anyagunkat.

Külön is szeretnénk köszönetet mondani mindazoknak, akik hozzájárultak könyvünk megszületéséhez és nevük kimaradt az elso kiadásból; köszönet illeti Zahemszky Gábort, lelkiismeretes és mindenre kiterjedo megjegyzéseiért, továbbá Zsemlye Tamást, akinek oroszlánrésze volt feladatgyujteményünk kidolgozásában.

A Kedves Olvasót pedig továbbra is arra kérjük, észrevételeit, jobbító javaslatait juttassa el a Kiadónak (akár egy e-mailben is), mert hisszük, hogy értékálló mu a mai gyorsan változó világban csakis az olvasóval együtt, annak igényeire hallgatva születhet és maradhat fenn...

Budapest, 1997 november

A Szerzõk

Page 16: unix kézkönyv
Page 17: unix kézkönyv

19

1. FEJEZET

BEVEZETÉS

1. A UNIX kialakulása 1969-et írtak, amikor az AT&T Bell Laboratóriuma kiszállt abból a projektbol, amelyet az MIT-vel együtt folytatott a Multics operációs rendszer kifejlesztése céljából. A Bell Laboratórium munkatársai így kényelmes interaktív számítógépes környezet nélkül maradtak. Ken Thomson és Dennis Ritchie ekkor fejlesztette ki egy „gazdátlan” PDP-7 típusú gépre a UNIX prototípusát, mely a Multics nyomán kapta nevét. Ez a rendszer már tartalmazta a UNIX legalapvetobb jellemzoit, nevezetesen az állomány- és processzkezelo alrendszert, valamint minimális számú egyéb segédprogramot.

1971-ben a UNIX-ot, mely ekkor még teljes egészében assemblyben volt megírva, s nem volt nagyobb 16 kilobyte-nál, PDP-11-re írták át. Ekkoriban hozta létre Ritchie a C programozási nyelvet, mely az addig létezo assembly és magasszintu nyelvek közötti igen szerencsés átmenetnek bizonyult. A UNIX rendszer magját, a kernelt (pontosabban annak legnagyobb részét) 1973-ban átírták C nyelvre, ami abban az idoben szokatlan ötletnek tunt. A C nyelvu kernel hordozhatósága következtében hamarosan már 25 UNIX rendszer muködött a Bell Laboratórium különbözo részlegeiben.

1974-ben jelent meg az elso nyilvános publikáció a UNIX-ról, s ekkortól kezdett el rohamosan terjedni, különösen az egyetemeken, ahol az AT&T a kezdeti idokben ingyenesen terjesztette.

1979-re már mintegy 500 különbözo UNIX rendszer muködött az Egyesült Ál-lamokban; különösen nagy népszeruségnek örvendett a telefontársaságoknál, ahol mind program-fejlesztési, mind hálózati tranzakciós feladatokra kiterjedten alkalmazták. Ebben az évben kezdték meg a kereskedelmi célú értékesítést is, és szintén ebben az évben történt meg az elso átvitel egy nem PDP gépre.

Az elso idoszak szabad terjesztési politikája a gyors elterjedés mellett hátrányokkal is járt: a szabadon terjesztett forráskódba bárki belenyúlhatott, saját képére és hasonlatosságára formálva a helyi UNIX rendszert. Az 1977-82 közti idoszakban az AT&T megpróbálta összefogni a saját UNIX variánsokat, s a Version 7 után a System III néven ismert rendszerrel jelent meg a piacon.

1983-ban (ekkor már százezer körül járt a muködo UNIX rendszerek száma), jelent meg a System III továbbfejlesztése, a System V, amelynek jelenlegi legfrissebb változata az 1997-ben bejelentett System V Release 5 (V.5).

Page 18: unix kézkönyv

UNIX felhasználói ismeretek

20

A Berkeley UNIX

A kaliforniai Berkeley egyetemen már 1977 óta használták a UNIX-ot, s az idok folyamán kialakult egy széles körben elterjedt saját UNIX változatuk, mely több ponton erosen eltér az AT&T verzióitól. E családot a BSD (Berkeley Software Distribution) jelzéssel látták el, legfrissebb változata a 4.4 BSD UNIX.

A Xenix

A Xenix volt az elso olyan UNIX rendszer, mely IBM PC gépekre készült. (Megrögzött Unix hívoket tán nem ildomos erre emlékeztetni, de kifejlesztoje a Microsoft volt...)Elso változatai csak i8088 processzoron futottak, s annak korlátozott képességei miatt igazi többfelhasználós muködést nem is tettek lehetové. Az i386 alapú PC-k megjelenésével a Xenix is biztosítja a hagyományos UNIX gépek funkcióit. A Xenix elsosorban az MS-DOS rendszerrel kapcsolatos plusz szolgáltatásokban tért el a System V és BSD alapú UNIX rendszerektol, így értelemszeruen a Xenix alapú gépek biztosítottak eloször lehetoséget az egy gépen párhuzamosan meglévo MS-DOS állományok UNIX alóli kezeléséhez. Mára, a nagyteljesítményu PC-k megjelenésével, egyre több „igazi” UNIX rendszert kínálnak PC-kre is; a „kereskedelmi” (értsd: fizetos) rendszerek közül messze a legelterjedtebb az SCO UNIX, de a szabadon hozzáférheto Linux és FreeBSD is rohamosan terjed.

Trendek és szabványok

Úgy tunik, a UNIX terjedési üteme az elkövetkezo években is megmarad, sot fokozódik. Pár éve még csak a miniszámítógépek területén volt jelentos a részesedése, azóta viszont mind a magasabb, mind az alacsonyabb teljesítménykategóriákban is elokelo helyet harcolt ki magának. A számítógépes rendszerek teljes piacán az 1981-es 2%-ról 1986-ra a UNIX kereken megháromszorozta jelenlétét, s 1991-es becsült piaci részesedése elérte a 22%- ot, ami több mint 30 milliárd dolláros forgalmat jelentett.

E hatalmas piac megszerzéséhez egy nagy problémával kell még megküzdeni a gyártóknak, s ez paradox módon épp a szabványok hiánya. A UNIX ugyanis közel sem olyan egységes és hordozható, mint azt eleinte hitték. A problémák gyökere a kezdeti idokre nyúlik vissza, amikor a UNIX forráskódját szabadon terjesztette az AT&T. Az ennek következtében létrejött variánsokat igen nehéz egységesíteni, az AT&T-nek is több esztendobe került, amíg házon belül kialakult valamiféle egység a System III képében.

Jelenleg óvatos becslések szerint is legalább hetven féle, jelentosen eltéro UNIX van kereskedelmi forgalomban, a System V, a BSD, illetve a Xenix megjelölés mindössze a kiindulási alapot biztosítja egy-egy UNIX rendszer megítélésénél. (Mindegyik változatnak vannak befolyásos támogatói, a System V a nagy európai szoftverházak körében és az üzleti alkalmazásoknál népszeru, a BSD változatok a kutatási intézményekben kedveltek.)

Page 19: unix kézkönyv

1. fejezet Bevezetés

21

Ilyen körülmények között a szabványosításnak rendkívüli a jelentosége, s a kilencvenes évek elejére felerosödtek az erre irányuló törekvések. A kezdo lépést az AT&T tette meg, amikor nyilvánosságra hozta az SVID (System V Interface Definition) néven ismert ajánlását. Ez lényegében az AT&T által szabványosnak tekintett System V rendszerhívásainak és szubrutinjainak egységes felhasználói felületét és definícióit határozza meg. Egy UNIX verzió akkor minosül SVID kompatibilisnak, ha átjut az AT&T úgynevezett validációs teszt-jein, mely a rendszerhívások SVID-konform voltát vizsgálja.

Az SVID kétélu fegyvernek bizonyult az AT&T számára: noha minden nagy szoftvercég elismerte az SVID jelentoségét, az riasztólag hatott rájuk, hogy az egységes UNIX jövoje egy közel sem pártatlan cég kizárólagos felügyelete alatt alakuljon. Mintegy ellenreakció is volt tehát, hogy a UNIX-ot forgalmazó szoftvercégek egy csoportja (a /usr/group nevu felhasználói csoport munkáját folytatva) Posix néven (Portable Operating System Interface (x)) néven egy szabványtervezetet dolgozott ki az IEEE égisze alatt, melyet jelenleg mind az ANSI, mind az ISO támogat. A Posix az SVID-ben definiált rendszerhívások mintegy hetven százalékát használja, számos területen hozzá is tesz azonban új vonásokat, elsosorban a valósideju, hálózati és adatbázis alkalmazások, valamint az Ada nyelvvel való kapcsolat területén. Hogy a dolog még tovább bonyolódjon, a legnagyobb európai gyártókat tömöríto X/OPEN csoport ugyan támogatta a Posixot, valamint többé-kevésbé az SVID-t is, de saját ajánlásaiban további — természetesen eltéro... — bovítéseket (szukítéseket) is ajánl. Ami ezek után az egyes UNIX-ot eloállító cégeket illeti, a még közel sem kiforrott szabványok közti lavírozásban egészen mostanáig a „mindennel (többé-kevésbé) kompatibilisnek lenni” elve kínálta az egyetlen kiutat. Így az általános gyakorlat szerint egy- egy UNIX rendszer alapvetoen valamelyik elterjedt változatra (System V vagy BSD) épül, de a rivális rendszer és a készülo szabványok szerinti egyéb rendszerhívásokat is tartalmazza, ha pedig azonos nevu rendszerhívások másképp muködnének az egyes változatokban, a felhasználó választhatja meg, melyik értelmezés szerint muködjön az adott rendszerhívás.

Egységes UNIX

Az elmúlt négy-öt év során a nagy UNIX fejleszto cégek között elkeseredett harc indult a UNIX egységesítéséért, pontosabban az általuk favorizált UNIX rendszerek szabványosításáért, s az ígéretesen növekvo piac megszerzéséért. A szakmában csak „The UNIX War” néven emlegetett háborúskodás 1987-ben vette kezdetét, amikor az AT&T bejelentette, hogy az addig a BSD rendszereket támogató Sun közremuködésével egységes UNIX-ot fejlesztenek ki, pontosabban, a System V következo változata, a System V Release 4 (SVR4) integrálni fogja az AT&T és a BSD rendszerek szolgáltatásait. E cél megvalósítására jött létre a UNIX International (UI) nevu tömörülés, támogatói között található többek közt az NCR, a Unisys és a Data General.

Az SVR4, amelyet az AT&T és a Sun mellett az Intel, a Microsoft és az INTERACTIVE Systems közremuködésével fejlesztettek, egyesíti magában a System V, a 4.3 BSD és a Xenix szolgáltatásait, valamint a Posix ajánlásainak is megfelel.

Page 20: unix kézkönyv

UNIX felhasználói ismeretek

22

Az SVR4 fo vetélytársa az Open Systems Foundation (OSF) által támogatott Unix verzió, az OSF/1 volt. Ez szintén egyesítette magában a fobb Unix variánsok funkcióit, de nem a hagyományos Unix kernelre támaszkodott, hanem a Carnegie-Mellon egyetemen fejlesztett Mach operációs rendszerre. A Mach rendszerhívási szinten teljesen Unix kompatibilis ugyan, de eleve többfonalas, ún. multithreaded kernelre épül. Ennek révén helybol támogatja a Unix többprocesszoros rendszereken való használatát, s a futó feladatok több processzor közti szétosztását is. E táborba sorakozott fel az IBM, a DEC, a HP, a Bull és a Siemens-Nixdorf is.

A két "ellenséges szekértábor" között mindig is volt mozgás, de az egész piac akkor bolydult meg igazán, amikor a Novell megvásárolta a Unix System Laboratories-t (USL), azt a céget, ami az AT&T jogutódjaként gondozta az SVR4 Unix rendszerek forráskódját. Az iparban hatalmas vihart kavart e lépés, mert kétségessé vált, hogy a Unixszal soha nem foglalkozott Novell teljes lélekkel fogja-e a továbbiakban támogatni a Unix fejlesztését. Talán éppen e félelmek miatt, egyre több cég vette meg a Unix forráskódját a Novelltol, hogy bebiztosítsa magát az esetleges késobbi "rugalmas elszakadásra".

A fenntartások igazolódtak, a Novell nem igazán tudott mit kezdeni a Unixszal, míg végül 1993-ban egy váratlan húzással átadta az SVR4 Unix védjegyet és az azzal kapcsolatos minosítési jogokat a független X/Opennek. Így a Unix-megfeleloség elbírálása végre egy gyártófüggetlen szervezethez került, ami jelentos lökést adhat a további fejlesztésnek. Az X/Open a Posix ajánlásokat továbbfejlesztve és a legfontosabb gyártókkal konzultálva fejlesztette ki az ún. Spec 1170 ajánlást, ami jelenleg a Unix minosítés alapját képezi. (A név onnan ered, hogy a megkérdezett gyártók közmegegyezéses alapon definiálták a számukra legfontosabb Unix rendszerhívásokat és segédprogramokat, mindazokat, amiket legfontosabb programjaik használnak - e kívánságlista összefésülése után pedig nem több és nem kevesebb mint 1170 parancs illetve rendszerhívás maradt a listán.) Az X/Open két minosítési szintet jelölt meg a Unix védjegyre pályázóknak, a nem teljes Posix megfeleloséget igazoló Unix 93, illetve az erosebb Unix 95 nevut. A Unix 95 címkét elnyero Unix verziók száz százalékosan megfelelnek a Spec 1170 szabványnak, s az alájuk írt programoknak (újrafordítás után persze) futniuk kell bármelyik másik Unix 95 minosítésu rendszeren.

Szintén örömteli fejleményként értékelheto, hogy a korszeru grafikus felhasználói felületek terén is kialakult egy egységes szabvány. A CDE (Common Desktop Environment) az X11/Motif grafikus ablakkezelo rendszerre épül, s ma már gyakorlatilag minden gyártó biztosítja grafikus felülettel bíró gépein. E szabvány jelentoségét nem lehet eléggé túlértékelni, hiszen így a Unixos gépeken dolgozó felhasználók a grafikus felület szintjén is egységes (és igen jól használható, számos korszeru eszközt tartalmazó) felülettel találkoznak, kiküszöbölve a Unix rendszerekkel szemben eddig felhozott legfontosabb kifogásokat.

Könyvünk legutolsó kiadásának zárásakor a két legfrissebb fejlemény a 64 bites Unix API specifikáció fejlesztése, illetve az a bejelentés, hogy az SCO megvette a Unix forráskódot a Novelltol, és a továbbiakban a Hewlett-Packarddal együtt hármasban fejlesztik a licenszátadás alapjául szolgáló Unix kódot. Utóbbi tény drámaian lecsökkenti a piacon lévo eltéro Unix kódverziók számát (már eddig is egyre többen gyakorlatilag változtatás nélkül vették át az eredeti USL majd Novell kódot, s ahhoz írtak kiterjesztéseket), és ez megint csak a gyorsabb és hatékonyabb fejlesztés irányába hathat. Az egységes 64 bites Unix specifikáció

Page 21: unix kézkönyv

1. fejezet Bevezetés

23

széles köru elfogadása pedig szintén ebbe az irányba mutat, lehetové téve hogy a Unix versenyképesen, egységes platformon megújulva léphessen át a huszonegyedik századba.

SVR 5Unix ’95Unix ’98

1. ábra: A fobb UNIX változatok kialakulása

Mi is a UNIX? A rendszer felépítése

Page 22: unix kézkönyv

UNIX felhasználói ismeretek

24

A UNIX szó nem csak egy szuk értelemben vett operációs rendszert jelent, hanem az ahhoz kapcsolódó felhasználói felületet, programokat és segédprogramokat (utility-ket) is, amelyek együtt egy többfelhasználós (multiuser), többfeladatos (multitasking) rendszert eredményeznek. Tanulságos lehet az MS-DOS, az OS-2 és a UNIX rendszert ebbol a szempontból összehasonlítani: az MS-DOS egyfelhasználós, egyfeladatos rendszer, azaz egyszerre csak egy felhasználó és egy programot futtathat rajta. Az OS-2 már többfeladatos rendszer, ahol egy felhasználó több feladatot is futtathat egyidoben. A UNIX alatt viszont egyszerre több felhasználó is dolgozhat, s mindegyikük több programot is futtathat egyidejuleg.

2. ábra: A UNIX felépítése

A UNIX réteges felépítésu, ezt szemlélteti a 2. ábra. A legbelso része a kernel, az operációs rendszer magja, amely a rendszer eroforrásainak szétosztását, és a futó folyamatok ütemezését végzi. A kernel köré épülnek a UNIX rendszer legkülönfélébb programjai (utility-k), amelyek a felhasználó parancsainak végrehajtásától kezdve a szövegfeldolgozáson át a kommunikációig, a rendszeradminisztrációtól a játékokig minden tevékenységet lefednek. Ezek közül a programok közül csak egy, bár a felhasználók számára kétségkívül a legfontosabb a parancsértelmezo (shell, „héj”, „burok” stb). Ez az a program, amelyik egy felhasználó belépésekor elindul, kiírja a promptot, beolvassa és értelmezi a felhasználó által begépelt parancsokat, meghívja az elindítandó programokat, gondoskodik a be- és kimenet kezelésérol, s egyúttal egy igen eroteljes, ugyanakkor rugalmas programozási nyelvet is nyújt a felhasználónak. Az átlag felhasználó számára az „a UNIX”, amit az operációs rendszerbol a shell-en keresztül lát, nem pedig a rendszerprogramozó által kiadható lehetséges rendszerhívások gyujteménye.

UNIX dokumentációk

Page 23: unix kézkönyv

1. fejezet Bevezetés

25

Különösen a kezdo felhasználó számára lehet nyomasztó a UNIX ismeretlensége, de a DOS-hoz szokott felhasználókat is zavarba ejtheti a UNIX mérete, bonyolultsága, a rendelkezésre álló parancsok nagy száma, s maga az a tény is, hogy többfelhasználós rendszerrel van dolga, ahol még a ki- és bekapcsolás se olyan egyszeru, mint egy PC-n. A rendszer méretével ráadásul arányos a dokumentációk és leírások terjedelme is. Mindezek miatt igen fontos annak ismerete, hogy milyen információt hol találhatunk meg a különféle leírásokban. Az alábbiakban az ezzel kapcsolatos alapveto ismereteket foglaljuk össze.

Kézikönyvek

A UNIX-hoz szállított kézikönyvek rendszerint két fo csoportra oszthatóak, nevezetesen a referencia kézikönyvekre (Reference Manual), és az összes egyébre; ezek rendszerint a megcímzett felhasználók, illetve témakörök szerint vannak csoportosítva, például User's Guide, vagy Programmer's Reference Manual, Administrator's Reference Manual, stb. Míg a referencia kézikönyvek nevüknek megfeleloen az egyes parancsok, rendszerhívások stb. részletekbe meno ismertetését nyújtják, a többi kötet vagy valamilyen bevezeto szintu, vagy haladóbb ismereteket ad a rendszer használatának egyes vonatkozásairól, például a hálózati szolgáltatásokról és parancsokról (a felhasználók számára), a hálózatadminisztrációról (a rendszeradmi-

Page 24: unix kézkönyv

UNIX felhasználói ismeretek

26

nisztrátorok számára), vagy éppen a hálózati felület programozásáról (fejlesztok számára).

Noha a dokumentáció szervezése rendszerrol rendszerre változik, teljes dokumentációkészlet esetén biztosak lehetünk abban, hogy találunk benne valami Getting Started ... jellegu, teljesen kezdoknek szóló leírást, ami átsegíthet bennünket a könyvtorony megpillantása kiváltotta kezdeti sokkos állapoton. Hasonlóképpen, a legfontosabb tevékenységekrol (szövegfeldolgozás, kommunikáció, stb) rendszerint részletekbe meno és jó magyarázatokkal ellátott kötetek szólnak.

A mindennapi munkában viszont még gyakorlott felhasználók sem tudnak meglenni a referencia kézikönyvek gyakori lapozgatása nélkül — s a parancsok nagy számát, s az opciók végtelen formagazdagságát tekintve ez nem szégyen.1 Az alábbiakban tehát a referencia kézikönyvek szerkezetét ismertetjük.

A referencia kötetek anyaga hagyományosan nyolc fejezetre tagolódik, ezek a következok:

1 A shell-bol kiadható, a felhasználó által meghívható parancsok (segédprogramok, utility-k).

2 Rendszerhívások. A UNIX kernel számára kiadható rendszerhívások gyujteménye, C nyelvi szintaxis szerint megadva, ahogyan egy C nyelvu programból hívhatóak.

3 Szubrutinok. A standard és opcionális rendszerkönyvtárak rutinjai, például stringkezelés, matematikai vagy képernyovezérlo rutinok.

4 Állományformátumok. 5 Vegyes szolgáltatások, állomány és adatformátumok. 6 Játékprogramok. 7 Perifériaállományok, a fizikai perifériákat reprezentáló fájlok struktúrája, és a

megfelelo eszközmeghajtó (device driver) vezérlo parancsok. 8 Rendszeradminisztráció és karbantartás.

1 A fenti eszmefuttatás persze csak a „konvencionális”, karakteres felhasználói felületet nyújtó UNIX rendszerekre igaz, a grafikus felhasználói felületek és az egér használata, a UNIX alatt is gyakran mentesíti a felhasználót a memoriter és a hosszas gépelés alól.

Page 25: unix kézkönyv

1. fejezet Bevezetés

27

A fentieken belül gyakran alcsoportokat is megkülönböztetünk, például egyes rendszerekben 1M alá kerülnek az egyébként nyolcadik fejezetbe tartozó karbantartó programok, 3M jelöli a matematikai szubrutinokat, 3N a hálózatiakat és így tovább. Az irodalomban az egyes parancsokra való hivatkozásnál zárójelek között rendszerint megadják, hogy a parancs a referenciakézikönyv melyik fejezetében található, például ls(1). Ha a referencia kézikönyv a fen- ti szempontok szerint tovább tagolt, akkor vigyázzunk arra, hogy egyes fe- jezetek mind a Programmer's Reference Manual-ban, mind a User's Reference Manual-ban megtalálhatóak (például utility-k), míg mások nem (például rendszerhívások értelemszeruen csak a Programmer's Reference Manual-ban szerepelnek).

A referencia kézikönyvek elején gyakran található egy úgynevezett permutált index, amely különösen akkor tehet jó szolgálatot, ha egy konkrét feladat megoldásához keresünk egy általunk ismeretlen programot. A permutált indexben minden egyes UNIX parancs szerepel egy egysoros leírás erejéig, de az index minden egyes parancsismerteto sor minden egyes szava szerint rendezett, s így tárgymutatóként használva pillanatok alatt megtalálhatóak azok a parancsok, amelyek leírásában az általunk keresett szó szerepel.

Például a cat parancs ismertetoje az alábbi: cat(1) — concatenate, copy, and print files

Ennek az alábbi sorok felelnek meg a permutált indexben: ... and print files. cat(1) — concatenate, copy, ... files. cat(1) - concatenate, copy, and print ... cat(1) — concatenate, copy, and print files. ... copy, and print files. cat(1) — concatenate, ... concatenate, copy, and print files. cat(1) — ...

Látható, hogy a parancsleírásban szereplo minden lényeges szó szerint rátalálhatunk a keresett parancsra.

Page 26: unix kézkönyv

UNIX felhasználói ismeretek

28

On-line help

Az on-line segítség legkézenfekvobb változatát saját hibáink keltik életre: számos UNIX parancs, ha paraméter nélkül, rossz paraméterezéssel, vagy a -? opciókkal hívjuk meg, kiír a képernyore egy meglehetosen tömör, de gyakran elegendonek bizonyuló üzenetet az adott parancs használatáról. (A shell-programozásnál látni fogjuk, hogy nagyon könnyen lehet ilyen úgynevezett "usage" stringeket beépíteni programjainkba, s mivel ez mind magunk, mind a többi felhasználó számára megkönnyíti az életet, az erre való "rászokást" csak ajánlani tudjuk az olvasónak - pár hónap után az ember már a saját programjánál se feltétlenül emlékszik, milyen paraméterekkel és hogyan hívható...)

Például ha az mv parancsot hívjuk meg rosszul: $ mv src.c mv: Insufficient arguments (1) Usage: mv [-f] [-i] f1 f2 mv [-f] [-i] f1 ... fn d1 mv [-f] [-i] d1 d2 $

Lehetoséget biztosít a UNIX arra is, hogy on-line módon hozzáférjünk a kézikönyvekhez. A man parancs hatására (paraméternek a referencia kézikönyv valamelyik tételének nevét kell megadni, például man cat, vagy man hosts), s a megnevezett UNIX parancs, rendszerhívás, vagy szubrutinra vonatkozó manuál oldalakat kilistázza a rendszer a képernyore.2

A permutált index on-line megfeleloje is létezik: a man -k3 kulcsszó parancs hatására (például man -k file) kilistázódik az összes olyan parancs egysoros leírása, amelyekben szerepel a megadott kulcsszó (esetünkben a file):

2 E képernyõs megjelenítés a hagyományos karakteres terminálokhoz igazodik, de például a SunOS rendszerben az AnswerBook program használatával a nyomtatott dokumentáció pontos mása is megjeleníthetõ egy nagyfelbontású grafikus terminálon. S az se mellékes, szempont, hogy az egyébként másfél folyóméternyi dokumentáció két CD lemezen elfér, s egyszerre többen is használhatják... 3 Ha az általunk használt gépen nem mûködik a man -k parancs, ennek legtöbbször az az oka, hogy alapértelmezés szerint nem fordítódik be a rendszerbe az ehhez szükséges adatbázis. A rendszeradminisztrátor a catman -w paranccsal pótolhatja e hiányosságot – érdemes ...

Page 27: unix kézkönyv

1. fejezet Bevezetés

29

... vhe_list(4) - information file for the Virtual Home Environment vhe_u_mnt(1M) - perform Network File System (NFS) mount to remote file system vipw(1M) - edit the password file vis, inv(1) - make unprintable characters in a file visible or invisible which(1) - locate a program file including aliases and paths x25init_smpl(4) - sample configuration file used to initialize an X.25 interface. x25upload(1M) - dump X.25/9000 interface card memory into a file. x29hosts(4) - PAD-related configuration file x3config(4) - PAD-related X.3 configuration file ypfiles(4) - Network Information Service database and directory structure ...

A whereis parancs révén (ez BSD alapú parancs, így nem minden rendszerben található meg) azt tudhatjuk meg, hogy az általunk keresett parancs vajon létezik-e UNIX rendszerünkben, s ha igen, akkor hol található a futtatható, illetve forráskódú változata, illetve a rávonatkozó esetleges kézikönyv rész: $ whereis cat cat: /bin/cat /usr/man/man1.Z/cat.1 $

Nem lehet eléggé hangsúlyozni a kézikönyvek (mind a nyomtatott, mind az on-line) változat használatának fontosságát: a UNIX olyan hatalmas rendszer, annyi paranccsal és parancsopcióval, hogy ezek számontartása és memorizálása hasztalan, s így felesleges is. Az on-line help szolgáltatás mindig hozzáférheto információkat ad a keresett parancsról. És végül még egy dolgot érdemes megemlíteni: az egyes eltéro UNIX változatok miatt eltéro gé-peken ugyanazok a parancsok eltéroen muködhetnek, illetve ugyanannak a parancsnak több változata is jelen lehet gépünkön, ezért mindig gondosan olvassuk el a kézikönyv erre vonatkozó utalásait. (Elrettento példaként ajánljuk az olvasó szíves figyelmébe az echo parancsot, amelynek legalább négy változata létezik, mind beépített shell funkció, mind önálló parancs formájában...)

Page 28: unix kézkönyv

30

2. FEJEZET

ALAPFOGALMAK

Ebben a fejezetben a UNIX-szal kapcsolatos alapveto fogalmakról ejtünk szót, mindazokról, amelyek a más operációs rendszerekhez szokott felhasználónak újdonságot jelenthetnek. Számos fogalom használatára lépten-nyomon sor kerül majd a következo fejezetekben, mások csak a megfelelo elméleti ismeretek biztosításához kellenek.

Többfeladatos-többfelhasználós muködés

Mint említettük, a UNIX úgynevezett többfelhasználós-többfeladatos (multiuser-multitasking) rendszer. A többfelhasználós muködés fogalma azt jelenti, hogy egyszerre több felhasználó is dolgozhat egy adott gépen, míg a többfeladatos muködés azt jelenti, hogy a gép egyszerre — legalábbis a felhasználó szempontjából — több programot tud futtatni. (Természetesen ez csak virtuálisan jelent „párhuzamos” futtatást, legalábbis egyprocesszoros rendszereken; a többprocesszoros rendszereknél már ténylegesen lehetséges, hogy az egyes processzorok külön-külön más-más feladattal foglalkozzanak.)

A UNIX fenti jellegének számos következménye van, mind a rendszer muködésére, mind a felhasználók munkájára nézve.

Page 29: unix kézkönyv

2. fejezet Alapfogalmak

31

Bekapcsolás-belépés-kilépés-kikapcsolás A többfelhasználós muködés egyik legalapvetobb következménye, hogy szétválik a rendszer bekapcsolásának és a felhasználó belépésének, illetve a felhasználó kilépésének és a gép kikapcsolásának folyamata. A hagyományos nagygépes rendszereken ez persze mindig is így volt, a PC-hez szokott felhasználók számára azonban ez a tényt nem lehet eléggé hangsúlyozni. Hogyan is zajlik tehát egy UNIX rendszer élete?

3. ábra: Egy UNIX rendszer „életciklusa”

A gép bekapcsolásakor eloször az operációs rendszer töltodik be a gép memóriájába, elindulnak az alapveto rendszerfolyamatok (ez a folyamat alkalmasint igen hosszú ido, több perc is lehet), s csak ez után kész a rendszer az egyes felhasználók fogadására. Ezt a terminálokon megjeleno beléptetési üzenet, az úgynevezett login prompt szokta jelezni. Az egyes felhasználók ekkor léphetnek csak be a rendszerbe, majd munkájuk végeztével kilépnek, de ettol a rendszer még futó állapotban marad, akkor is, ha éppen egyetlen felhasználó sincs bejelentkezve. Késobb látni fogjuk, hogy még ebben az „üresjárati” állapotban is számos kiszolgáló és felügyelo program fut a háttérben, amelyek a rendszer muködését vezérlik.

A rendszer lekapcsolását általában a rendszergazda hajthatja végre a rendszerterminálról; a kikapcsolási parancs hatására sorra leállnak a rendszer funkciói, biztonságos állapotba kerülnek a rendszer legfontosabb adatai, s csak ezek után lehet fizikailag is kikapcsolni a

Page 30: unix kézkönyv

UNIX felhasználói ismeretek

32

gépet. Másképpen fogalmazva: UNIX-ot futtató gépet (PC-t sem!) NEM SZABAD a hálózati kapcsolóval egyszeruen kikapcsolni!! Ennek okaira a késobbiekben még visszatérünk.

Az elobbiek alapján egy UNIX rendszer „életciklusát” a 3. ábra szemlélteti.

Bejelentkezési nevek és kulcsszavak Az egyes felhasználókat a UNIX a bejelentkezési nevük (login name) alapján különbözteti meg egymástól. A bejelentkezési (vagy belépési) név egy általában 8 karakternél nem hosszabb karaktersorozat, amit a rendszeradminisztrátor oszt ki az új felhasználóknak, s ennek begépelésével jelezzük a rendszernek belépési szándékunkat.

Az alábbi példa a guest belépési névvel történo bejelentkezést mutatja. Attól függoen, hogy honnan és milyen gépre jelentkezünk be, a login szó elott bizonyos üzenetek jelenhetnek meg a képernyon, amelyek a gépet és a terminált azonosítják a felhasználó számára. HP-UX hp A.08.02 B 9000/817 (ttys1) login: guest password:

A belépési név megadása után a rendszer egy jelszót (password) kér tolünk. Mivel a UNIX többfelhasználós rendszer, a kulcsszavas védelemre mindenképpen szükség van, hogy az egyes felhasználók adatainak védelmét és titkosságát biztosítani lehessen a többi felhasználóval szemben. Új felhasználók kulcsszavát általában a rendszeradminisztrátor állítja be, de a felhasználó megváltoztathatja azt, a passwd parancs használatával.

A kulcsszó sikeres megadása után különféle rendszerüzenetek jelenhetnek meg a képernyon (például van-e az illetonek új levele, általános érdeklodésre számot tartó rendszeradminisztrátori közlemények, stb), végül megjelenik az úgynevezett parancs prompt, ami leggyakrabban egy $, %, vagy # karakter. E parancs prompt jelzi azt, hogy a belépés folyamata sikeresen lezajlott, s a rendszer készen áll parancsaink fogadására.

Normál és privilégizált felhasználók A UNIX rendszerekre, mint általában a hagyományos nagygépes rendszerekre, is igaz az, hogy a felhasználók közül egyesek speciális elojogokkal bírnak. Ezek a privilégizált felhasználók a rendszeradminisztrátorok és operátorok, akik az egész rendszer muködését felügyelik. Számos olyan tevékenység van, amit csak a privilégizált felhasználók hajthatnak végre (például a rendszer kikapcsolása, új felhasználók adminisztrációja, programcsomagok installálása stb). A privilégizált felhasználók között is kiemelt szerepe van a rendszergazdának (superuser). A rendszergazda élet és halál ura a rendszerben, o az, aki mindent megtehet, mert mindenre van jogosultsága. Minden UNIX rendszerben kell hogy

Page 31: unix kézkönyv

2. fejezet Alapfogalmak

33

legyen egy rendszergazda, hogy egyéb privilégizált felhasználók vannak-e, az a helyi viszonyok függvénye, kisebb rendszerekben általában csak a rendszergazdai hatáskör létezik, nagyobb rendszereken más-más személy lehet felelos a hálózatadminisztrációért, az installálásokért, vagy mondjuk az archiválásokért.

A rendszergazda bejelentkezési neve hagyományosan root (az angol gyökér szóból ered, ennek némileg népszerusíto magyarázata az, hogy a rendszergaz- da fennhatósága a fájlrendszer gyökerétol kezdve mindenre kiterjed). Az egyéb szokásos rendszeradminisztrátori nevek a bin, adm, admin, fsck, sys, daemon.

Terminálelérés: soros vonali és hálózati és rendszerterminálok

A felhasználó számos úton-módon csatlakozhat egy UNIX rendszerre, most csak a legalapvetobb hozzáférési módokat tekintjük át. Leggyakoribb szituáció, foképpen a közép- és nagykategóriába eso rendszereknél, hogy maga a UNIX-os gép kialakítása olyan, hogy számos terminált lehet rá csatlakoztatni közvetlenül, ún. soros vonalon keresztül. (A mai technikai szinten ez általában legalábbis több tucat soros vonali csatlakozást jelent, de a több száz terminál kiszolgálására képes architektúrák se mennek ritkaságszámba.) Ez a megoldás a hagyományos nagyszámítógépes rendszerek kialakításának felel meg.

A gépre csatlakozó terminálok között mindig van egy, ami kitüntetett jelentoséggel bír, ez az úgynevezett rendszerterminál (konzol, console). Ez rendszerint közvetlenül a gép mellett helyezkedik el, s ez a rendszergazda munkahelye. Pontosabban fogalmazva, számos, a rendszer szempontjából kritikus akció csak a rendszerterminálról indítható, elsosorban biztonsági megfontolásokból. Munkaállomásokon, illetve PC-n futó UNIX esetén értelem-szeruen a munkaállomás, illetve a PC billentyuzete és képernyoje a rendszerterminál.

A helyi hálózatok terjedésével egyre gyakoribb eset az, hogy a felhasználók hálózaton keresztül érik el a UNIX-os rendszert, akár valamilyen Ethernet alapú helyi hálózaton keresztül (LAN), a saját PC-jükrol bejelentkezve, vagy éppen nagytávolságú hálózaton (WAN) keresztül, akár telefonvonalon, modem segítségével, de akár X.25 alapú csomagkapcsolt hálózaton keresztül is. Ilyen esetekben hálózati hozzáférésrol van szó, de a felhasználó számára — elvileg! — teljesen észrevehetetlen kell hogy legyen az a tény, hogy nem közvetlenül csatolt terminálon dolgozik. A 4. ábra egy olyan UNIX-os rendszert mutat, ahol mind soros vonali, mind helyi hálózati, mind modemen keresztül csatlakozó nagytávolságú hálózati terminálok használják a UNIX rendszert.

Page 32: unix kézkönyv

UNIX felhasználói ismeretek

34

4. ábra: UNIX rendszer terminálkapcsolatai

Folyamatkezelés: elotér- és háttérfolyamatok, démonok és jobok

Page 33: unix kézkönyv

2. fejezet Alapfogalmak

35

Programok és folyamatok

A UNIX, mint multitasking rendszer, képes arra, hogy egyszerre több feladat futhasson a gépen. Ennek kapcsán két igen fontos fogalom merül fel, amelyek szorosan összefüggenek ugyan, de egymással nem helyettesíthetoek be: a program és a folyamat (process). A program egy futtatható (akár gépi kódot tartalmazó bináris, akár a shell által értelmezheto parancsokból álló) fájl; valahányszor egy programot elindítunk, egy új folyamat jön létre. Némileg leegyszerusítve, a folyamat egy programnak egy futó példánya, a saját külön adatterületével. Lehetséges tehát, hogy ugyanazt a programot egyszerre többen is futtassák a rendszerben — ilyenkor ugyanabból az egy programfájlból annyi darab önálló, egymástól teljesen független folyamat jön létre, ahányan elindították a programot. (Csak zárójelben jegyezzük most meg, egy elindított folyamat több másik, ún. gyermekfolyamatot is elindíthat.)

Háttérfolyamatok és démonok

A parancsok (pontosabban a parancsok elindításával életre keltett folyamatok) végrehajtása szekvenciálisan történik; ez annyit jelent, hogy ha a felhasználó elindít egy parancsot, addig nem kapja vissza a parancs promptot, s nem indíthat el újabb parancsot, amíg az éppen futó be nem fejezodött. Ha azonban a felhasználó egy háttérfolyamatot (background process) indít el, rögtön visszakapja a parancspromptot, s lehetosége van újabb parancs végrehajtására. E mechanizmus használata kiváltképp olyankor elonyös, ha egy hosszan futó folyamat futtatása mellett más tevékenységgel is szeretnénk foglalkozni.

Page 34: unix kézkönyv

UNIX felhasználói ismeretek

36

A háttérfolyamatoknak egy speciális válfaja a démon (daemon) folyamat. Ez egy olyan folyamat, amit rendszerint automatikusan indít el a rendszer, s valamilyen felügyeleti szerepet ellátva állandóan fut a háttérben. Démon folyamatok gondoskodnak például a nyomtatási kérelmek besorolásáról és végrehajtásáról, a terminálvonalak figyelésérol, hogy van-e újonnan belépo felhasználó, de démonok felügyelik a memóriahasználatot éppúgy, mint a lokális hálózaton történo belépéseket. A rendszer „üresjáratában”, amikor éppen nincs bejelentkezett felhasználó, általában több tucat ilyen démonfolyamat fut, biztosítva a rendszer folyamatos muködését.

A démonoknak végrehajtásra átadott nyomtatást és egyéb kérelmeket job-oknak (feladatoknak) nevezik, ezeket a démon sürgosségi és egyéb szempontok alapján sorba rendezi (queue), és egyenként hajtja végre oket.

A parancsértelmezo (shell) A UNIX alatt futtatható programok között van egy, ami a rendszer szempontjából a többivel teljesen egyenrangú, a felhasználó számára azonban kitüntetett jelentoséggel bír: ez a program a parancsértelmezo (burok, héj, shell). A parancsértelmezo az a program, ami egy felhasználó belépésekor aktivizálódik, s a felhasználó kilépéséig o veszi magára a felhasználó által begépelt parancsokat. A shell feladata éppen ez: a felhasználó által begépelt karaktersorozatokat szétbontja, megpróbálja végrehajtható parancsként értelmezni, feldolgozza és kifejti a parancsnak átadandó paramétereket, megkeresi az elindítandó programfájlt, és megpróbálja azt elindítani; a parancs végrehajtása után pedig visszaadja a vezérlést a felhasználónak, s kész az újabb begépelt parancsok végrehajtására.

A fentiekbol is látható, hogy a shell alapveto fontosságú a felhasználó életében, hiszen gyakorlatilag csak azt látja a UNIX-ból, amit a shell látni enged.

Page 35: unix kézkönyv

2. fejezet Alapfogalmak

37

A shell mint programozási nyelv

A shell azonban, az elobb elmondottakon túl, egy programozási nyelv is: lehetoség van a shell használatakor változókat definiálni, komplex vezérlési szerkezeteket, ciklusokat és elágazási feltételeket definiálni, gyakorlatilag a „komoly” programozási nyelvekben megszokott összes mechanizmus rendelkezésre áll. S mivel ezek a nyelvi szolgáltatások minden fordítás nélkül, a parancssorba történo begépeléskor rögtön rendelkezésre állnak a felhasználónak (interpreter elv), villámgyors és könnyen korrigálható lehetoség van komplex feladatok kipróbálására és megvalósítására anélkül, hogy az ember egy sort is leírna bármilyen magasszintu programozási nyelven.

A shell parancsok fájlba írásával (shellscript) pedig arra nyílik lehetoségünk, hogy bármikor újra futtathassunk egy adott shell parancsszekvenciát.

A „szerszámosláda” és a „deszkapad modell”

A UNIX shell számos mechanizmust biztosít arra, hogy már meglévo programok egymással való együttmuködését koordinálja, lehetoséget ad arra, hogy az egyik program kimenetét a másik program felhasználhassa, stb. A shell-nek éppen ez a legnagyobb erossége, hiszen így már meglévo, adott esetben csak egy-egy apró részfeladatot ellátó programocskákból olyan összetett parancsszekvenciákat építhetünk fel, amelyek már nagybonyolultságú, meglepoen komplex feladatokat oldanak meg — ismét csak hangsúlyozva, anélkül, hogy az ember a megszokott módon, valami magasszintu nyelvben „programozna”. Ez a mentalitás a UNIX-ban oly gyakran emlegetett szerszámosláda-filozófia (toolbox philosophy): meglévo apró elemeket építsünk össze nagyobbakká, ahelyett, hogy folyton újra fel kellene találnunk a kereket.

E módszer egyenes alkalmazása a mostanában oly divatos prototyping elve. Mit jelent ez? Tegyük fel, hogy egy IGEN BONYOLULT, IGEN SOKRÉTU feladatot kell megoldanunk. Az egyik lehetséges megoldás az, hogy nekiállunk, és egy kiválasztott magasszintu nyelven „beprogramozzuk” az egészet, lefordítjuk, futtatjuk, hibát keresünk, s így tovább, amíg a tökéletesség és hatékonyság megkívánt szintjét el nem értük. Más megoldás? Elo a szerszá-mosládával: megpróbáljuk már meglévo UNIX eszközeinkkel és programjainkkal megoldani a feladatot, egy shellscript-et írva, ami integrálja már meglévo saját- vagy rendszerprogramjainkat. Így viszonylag hamar beloheto ez a „deszkapados modell” (általában nagyságrenddel hamarabb, mint egy konvencionális programozási nyelvben), s a már muködo modellt ezek után optimálhatjuk: a leglassabban muködo részeket átírhatjuk valami hatéko-nyabb programozási nyelven — a lényeg az, hogy mindig csak a szükséges részeket és a szükséges mértékben optimalizáljuk.

Különbözo shell-ek

Page 36: unix kézkönyv

UNIX felhasználói ismeretek

38

Mivel a parancsértelmezo nem része a UNIX magjának, hanem „csak” egy ugyanolyan program, mint a többi sok száz rendszer- és segédprogram, tetszolegesen lecserélheto, és ízlés szerint másra váltható. Három általánosan elterjedt shell létezik a UNIX alatt (a kevésbé elterjedteket még felsorolni is fárasztó lenne), ezek a következok: a Bourne shell, a C shell és a Korn shell. A felhasználó, illetve a rendszeradminisztrátor döntésén múlik, hogy egy felhasználó milyen shell-lel dolgozik a UNIX alatt, s lehetoség van arra is, hogy a felhasználó menetközben, ideiglenes jelleggel újabb és újabb parancsértelmezot indítson el a meglévo fölé, ha az éppen futó valamilyen okból nem felel meg neki. Mindez hihetetlen rugalmasságot kölcsönöz a rendszernek.

A Bourne shell, mely nevét szerzojérol kapta, „a” szabványos UNIX parancsértelmezo, ez minden UNIX rendszerben kell hogy szerepeljen. Könyvünk túlnyomó részében ezzel foglalkozunk mi is, éppen szabványos volta miatt.

A C shell, mely szintén régóta része a standard UNIX-nak, jóval többet tud, mint a Bourne shell, például lehetoség van az elozo parancsok elohívására és átszerkesztésére, fejlett jobkezeléssel és még számos más kellemes vonással rendelkezik, nevét onnan kapta, hogy a kiadható parancsok és a vezérlési szerkezetek a C nyelvre emlékeztetnek (nem véletlenül).

A Korn shell, mely szintén szerzojérol lett elnevezve, újabb, mint az elozoek, egészen mostanáig public domain szoftverként, illetve késobb már kereskedelmi forgalomban is megveheto programként terjedt, az SVR4-nek viszont már részét képezi, mi több, ez lett a szabványos parancsértelmezo. Ezt annak köszönheti, hogy rendelkezik a C shell funkcióival, ugyanakkor felülrol teljesen kompatibilis a Bourne shell-lel, tehát a felhasználónak nem kell egy teljesen új szintaxist megtanulnia.

A könyvünkben szereplo shell programozási példák többsége Bourne shellscript-et használ, de a C shell-rol és a Korn shell-rol szóló fejezetek természetesen a megfelelo nyelven írt script-eket is tartalmaznak.1

A fájlrendszer: Fájlok és katalógusok, névkonvenciók

A fájlrendszerrol a következo fejezetben részletesen lesz szó, most csak a legfontosabb dolgokat tekintjük át vele kapcsolatban. A fájlrendszer a UNIX legalapvetobb része, megértése nélkülözhetetlen a felhasználó számára, de megismerése már csak amiatt is tanulságos, mert kiválóan illusztrálja azt, hogy egyetlen, alkalmasan megválasztott, a végletekig leegyszerusített fogalom konzekvens implementálásával milyen robusztus és megbízható rendszer hozható létre.

1 A C shell-t különbözõ okok miatt nem szokták ajánlani shell scriptek írására, elõnyei inkább intaraktív környezetben, parancseditáláskor domborodnak ki.

Page 37: unix kézkönyv

2. fejezet Alapfogalmak

39

A UNIX-ban minden fájl.2 Erre az elso látásra igencsak túlzónak tekintheto állításra épül az egész UNIX rendszer. Jó, de mi is akkor a fájl? A fájl (állomány, file) az adatok tárolására szolgáló alapveto (adat)objektum a UNIX alatt. A fájl teljesen strukturálatlan, nincs sem rögzített, sem változó hosszúságú mezokre vagy rekordokra bontva, nincs megszabott hosszúsága, semmi ilyen korlátja nincs — a fájl egész egyszeruen bájtok (karakterek) sorozata. Egy UNIX fájl végét nem jelzik speciális karakterek, mint például a DOS-ban a Ctrl-Z — a fájlnak akkor van vége, amikor a megfelelo olvasó rutin semmit nem tud már olvasni, s az ennek megfelelo hibajelzéssel tér vissza. Mi lehet egy fájlban? Minden. Egy fájl tartalmazhat adatokat (például elektronikus leveleket, tozsdei jelentéseket, számolótábla-táblázatokat); tartalmazhat futtatható programokat (akár gépi kódúakat, akár úgynevezett shellscript-eket), amelyeket a felhasználó elindíthat; tartalmazhat egy fájl a többi fájlokra és az egész fájlrendszerre vonatkozó információkat (katalógusfájlok); mi több, a perifériák (terminálok, diszkek, hálózati egységek stb) szintén fájlként szerepelnek a UNIX-ban, s ugyanazokkal a standard parancsokkal lehet hozzájuk férni, mint bármely másik „közönséges” fájlhoz. A UNIX a fájlokat a könnyebb kezelhetoség érdekében katalógusokba (jegyzék, könyvtár, directory) csoportosítja. A katalógusok egy faszerkezetre emlékezteto struktúrába vannak szervezve. E megoldásra a következo fejezetben bovebben visszatérünk, most csak egy nagy elonyét említjük meg: e fájlhierarchia révén megoldható az, hogy minden felhasználónak külön adatterülete legyen, esetenként ugyanolyan nevu fájlokkal, mint másoknak, s az azonos nevu fájlok ennek ellenére nem téveszthetoek össze a többiekével.

A katalógusok maguk is fájlokban helyezkednek el, ezek a fájlok a UNIX fájlrendszer számára éppolyan fájlok, mint azok, amelyekrol az információt tárolják; az egyetlen eltérés, hogy a katalógusfájlok manipulálására külön parancsok szolgálnak, ezeket a következo fejezetben tekintjük át.

Felhasználói- és csoportazonosítók Láttuk már, hogy a UNIX a belépo felhasználókat a bejelentkezési név alapján ismeri fel. Ezen kívül még két azonosítót is rendel a UNIX az egyes felhasználókhoz, a felhasználói azonosítót (user id, uid) és a csoportazonosítót (group id, gid). Mindkét azonosító egy egész szám, a felhasználói azonosító egy az egyben megfelel a bejelentkezési névnek, s a legtöbb programban e két paraméter egymással felcserélheto.

A UNIX a csoportazonosító alapján csoportokba sorolja a felhasználókat — ennek akkor van jelentosége, ha a felhasználó hozzá akar férni egy fájlhoz, mert a rendszer a hozzáférési kérelmeket aszerint bírálja el, hogy a felhasználó tulajdonosa-e az adott fájlnak, vagy a tulajdonossal azonos csoportban van-e. A csoportazonosító használata révén így lehetoség

2 A fenti kifejezést némileg tompítva, de jóval pontosabban úgy fogalmazhatnánk meg, hogy a Unix a lehetõségek szerint minden adatobjektumot azonos módon, azonos parancsokkal próbál meg kezelni.

Page 38: unix kézkönyv

UNIX felhasználói ismeretek

40

van a felhasználók anyagainak differenciált védelmére, s egyúttal a közös munka megkönnyí-tésére. (Egy felhasználó több csoportba is tartozhat.) Az azonosítók használatára a következo fejezetben látunk majd példákat.

Hozzáférési jogok és végrehajtható fájlok A UNIX minden fájlhoz hozzáférési jogokat rendel: ennek alapján dönti el, hogy egy adott fájlt egy adott felhasználó írhat, olvashat, vagy végrehajthat-e.

Végrehajtható fájlok, bináris programok és shellscript-ek

A fájlok nagy többsége általában valamilyen adatfájl, amiket az arra hivatott programok révén írnak-olvasnak a felhasználók. A fájlok másik csoportja viszont úgynevezett végrehajtható fájl, ami egy végrehajtható kódsorozatot tartalmaz. E tényrol a UNIX úgy értesül, hogy e fájlok végrehajtási engedéllyel rendelkeznek. Ha egy ilyen fájl nevét adjuk meg végrehajtandó parancsként, az operációs rendszer megpróbálja elindítani oket. Egy végrehajtható fájl tartalmazhat gépi kódú utasításokat, olyat, amit végrehajtáskor rögtön megért az operációs rendszer (az úgynevezett rendszerprogramok túlnyomó többsége ilyen), ezek a bináris végrehajtható programok (binary executable). A végrehajtható fájlok másik csoportja olyan parancsokat tartalmaz, amelyeket nem az operációs rendszer, hanem a parancsértelmezo, a shell értelmez és hajt végre. Ezeket a fájlokat hívják shellscript-eknek, s a DOS-ból ismert batch fájlokhoz állnak legközelebb.

Page 39: unix kézkönyv

41

3. FEJEZET

ISMERKEDÉS AZ ÁLLOMÁNYRENDSZERREL

Bejelentkezés Az alábbiakban feltételezzük, hogy az olvasó már egy UNIX operációs rendszert futtató számítógép terminálja elott ül. E terminál lehet egy nagygépes rendszer valamelyik terminálja a sok közül, lehet egy munkaállomás, vagy éppen egy PC, ami helyi hálózaton keresztül csatlakozik a UNIX gazdagéphez (host-hoz), egy UNIX terminált emulálva. Ennek megfeleloen a bekapcsolási eljárások is gyökeresen eltérhetnek egymástól, az elso esetben valószínuleg csak a terminált kellett bekapcsolni, a munkaállomásnál a bekapcsolás után az operációs rendszer betöltodését kell megvárni, míg PC-s terminál esetében DOS vagy Windows alól kellett kiadni a megfelelo parancsot a kommunikációs- és terminálemulátor program betöltéséhez. Bármelyik módon is indultunk, a képernyon elobb-utóbb az alábbihoz hasonló szövegnek kell megjelennie (az alábbi konkrét példa egy lokális hálózaton keresztüli, a telnet paranccsal végrehajtott belépést mutat, az elso három kiírt sor ezzel kapcsolatos): # telnet hp Trying 197.99.99.99 ... Connected to hp. Escape character is '^]'. HP-UX hp A.08.02 B 9000/817 (ttys1) login:

A login: szöveg után kell megadnunk a bejelentkezési nevünket (login name), ezt elozoleg a rendszergazda létre kellett hogy hozza. A bejelentkezési név megadása után általában jelszót is kér a rendszer (amennyiben nem, az súlyos biztonsági hiba!): login: demoRETURN password: A fenti példánál a RETURN megadásával jelöltük, hogy a UNIX-ban (is) a parancsbevitel végét a kocsivissza (RETURN, CR, ENTER stb jelzésu) billentyu lenyomása jelenti — a továbbiakban ezt sehol nem jelöljük, kivéve ha a szövegösszefüggés kimondottan megköveteli.

Page 40: unix kézkönyv

UNIX felhasználói ismeretek

42

A jelszó begépelésekor a rendszer nem adja vissza a képernyon a begépelt karaktereket. Ha rossz jelszót adtunk meg, az alábbi szöveg jelenik meg: login incorrect login:

Néhány próbálkozás (rendszerint három vagy öt) után az adott terminálvonalat blokkolja egy idore a rendszer, feltételezvén, hogy rosszindulatú behatolási kísérlet történt. Ilyenkor másik terminálról próbálkozhatunk, vagy kivárjuk az idot, amikor újra aktiválódik a vonal. (Munkaállomások, és PC-ken futó UNIX esetében, ahol rendszerint egy helyrol van hozzáférés a rendszerhez, a konzolról, a fenti módszer nem járható, ilyenkor nem célszeru az egyetlen belépési lehetoséget korlátozni1.

Sikeres jelszómegadás után néhány rendszerüzenet jelenhet meg a képernyonkön, rendszerint kiírja a gép, ha új levelünk érkezett, szintén bejelentkezéskor szoktak megjelenni a mindenkit érinto fontosabb közlemények, s legvégül az utolsó sorban megjelenik a prompt, ami jelzi, hogy a bejelentkezés sikeresen lezajlott, a rendszer (pontosabban a számunkra kijelölt pa-rancsértelmezo program) készen áll a parancsok fogadására és végrehajtására.

1 Szükség esetén azért ezek a gépek is elérhetõek több helyrõl, vagy helyi hálózaton, vagy a soros portra csatlakoztatott terminálokon keresztül.

Page 41: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

43

login: demo password: You have mail. Mindenkinek! Szerdán négytől hatig rendszerkarbantartás miatt a szerver nem működik. $

Esetünkben a promptjel a $ karakter, de bármi egyéb is lehet, s a késobbiekben bemutatott módon magunk is átállíthatjuk. Ha parancsértelmezonk a Bourne vagy a Korn shell, akkor rendszerint a $ karakter a prompt, C shell használata esetén pedig a % karakter hsználata az általános. (C és Korn shell esetén lehetoség van arra, hogy a prompt a DOS alatt megszokott módon mutassa az aktuális munkakatalógust is, ezért gyakran szokás ezt és/vagy a gépnevet kiíratni.)

Szintén általános érvényu konvenció, hogy ha privilégizált felhasználóként jelentkezünk be, a prompt a # karakterre vált, ezzel is emlékeztetve a felhasználót arra, hogy most az átlagosnál felelosségteljesebb tevékenységet folytat.

A fájlrendszert kezelo parancsok Az 5. ábra illusztrálja a UNIX fájlrendszerének felépítését. Látszik, hogy az egész struktúra leginkább egy fejjel lefele fordított fára emlékeztet. A fa gyökerének szerepét betölto katalógust root directory-nak, azaz gyökérkatalógusnak nevezik, s ebbol ágaznak el a további katalógusok, azokon belül további alkatalógusok és így tovább. A fa leveleinek pedig a kata-lógusokban található fájlok felelnek meg, ezekbol nem ágaznak tovább katalógusok. Minden UNIX fájlrendszer a fentieknek megfeleloen épül fel, eltérések csak a katalógusnevekben és a katalógusok tartalmában jelentkeznek.

Page 42: unix kézkönyv

UNIX felhasználói ismeretek

44

5. ábra: A UNIX fájlrendszer felépítése

A fájlrendszer kitüntetett pontjai

A UNIX fájlrendszerében három kitüntetett pont létezik az egyes felhasználók számára: a fájlrendszer kezdopontja, ahonnan az egész állományrendszer felépül (gyökérkatalógus, root directory); az egyes felhasználókhoz tartozó kiindulási pont, ahonnan kezdve o helyezheti el saját állományait (kiindulási katalógus, vagy alapkatalógus, home directory); végül az a pont, ahol a felhasználó éppen tartózkodik az állományrendszerben (aktuális katalógus vagy másnéven munkakatalógus, current directory).

Hol vagyunk? A pwd parancs

A fájlrendszerrel való ismerkedést a pwd (print working directory) nevu paranccsal kezdjük. E parancsot meghívva az aktuális katalógus neve íródik ki a képernyore.

Page 43: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

45

$ pwd /users/demo $

A fenti kiírásban a UNIX állományrendszerének hierarchikus felépítése tükrözodik, s a következoképpen kell értelmezni: a gyökérkatalógus alatt elhelyezkedo users katalógus demo nevu alkatalógusában tartózkodunk. A pwd eredményében látható / jel kettos szerepet tölt be: egyfelol jelöli az állományrendszer kezdopontját, azaz a gyökérkatalógust, másfelol az egyes katalógusszintek elválasztójeleként is funkcionál. (A DOS-hoz szokott olvasót fi-gyelmeztetjük, hogy noha az állományrendszer koncepciója és a jelölésmód eros hasonlóságot mutat, itt nem a DOS alatt megszokott \ (backslash) karaktert kell használni a katalógusszintek elválasztására.)

Mit láthatunk? Az ls parancs

Ha már tudjuk, hogy hol tartózkodunk az állományrendszerben, valószínuleg azt is szeretnénk megtudni, milyen fájlok találhatóak az egyes katalógusokban. A katalógusok tartalmát az ls (list) paranccsal listázhatjuk ki. Ha semmi mást nem mondunk, az aktuális katalógusban lévo fájlok nevét listázza ki, ábécésorrendben: $ ls FULL-INDEX text $

Ha az ls parancsnak argumentumai is vannak, akkor két eset lehetséges: ha az argumentum egy közönséges fájl neve volt, akkor az adott fájlra vonatkozó információkat írja ki az ls parancs, ha viszont az argumentum egy katalógusfájl neve volt, akkor az ebben a katalógusban szereplo összes fájl adatait. Mivel az ls parancsnak is megadhatunk több parancs argumentumot, ezek lehetnek vegyesen fájl és katalógusnevek, az ls mindegyiket a neki megfelelo módon fogja kezelni. Ha a -l opciót is kiadjuk, részletesebb információt is kapunk a fájlokról: $ ls -l total 354 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 19 Aug 23 20:23 text $

Nemsokára részletesebben is visszatérünk a fentebb látható kiírás értelmezésére, most csak dióhéjban: a legelso sor (total ...) azt adja meg, hogy a kilistázott katalógusban lévo fájlok összesen hány blokknyi helyet foglalnak el a lemezen (egy blokk általában 512 karakter, azaz fél kilobájt). A többi sorban az elso oszlop a hozzáférési jogokat mutatja, azaz azt, hogy kinek milyen joga van az adott fájllal kapcsolatban (írhatja, olvashatja, végrehajthatja-e); a következo oszlopban álló szám az úgynevezett láncszám (link count): ez mutatja meg, hogy egy adott fájlra hány különbözo néven (link) lehet hivatkozni; aztán az állomány tulajdonosának és csoportjának neve következik, majd a fájl mérete bájtokban, aztán az utolsó módosítás ideje, s legvégül a fájl neve.

Page 44: unix kézkönyv

UNIX felhasználói ismeretek

46

Az ls számos opciója közül most csak a leggyakrabban használtakat emeljük ki. Ha a fájlokat nem ábécésorrendben, hanem idorendben (a legutolsó módosítás ideje szerint) szeretnénk kilistázni, akkor a -t opciót kell megadni; ha fordított sorrendu rendezést kívánunk, akkor a -r opciót. A -R opció hatására az ls parancs rekurzív módon a megadott katalógusnév alatti teljes fájlstruktúrát kilistázza, nem csak a megnevezett katalógusban szereplo fájlokat. Az op-ciók persze kombinálhatóak is, így például ls -lrt fordított idosorrendben hosszú listázást ad, a legrégebbi fájlokat sorolva fel elsoként, a legfrissebbeket utoljára.

Hová jutunk? A cd parancs

Az állományrendszerben való mozgásra a cd (change directory) parancs szolgál. Paraméterként a megcélzott katalógus nevét kell megadni, ami történhet mind abszolút (teljes) elérési út (absolute pathname), mind relatív elérési út (relative pathname) megadásával. Abszolút megadás esetén a keresett katalógus teljes elérési útvonalát meg kell adnunk, a gyökérkatalógustól kezdve, s minden alkatalógust fel kell sorolni, amelyeken keresztül a célhoz jutunk. Ebben az esetben a cd parancs paramétere a / karakterrel kell hogy kezdodjön, a cd parancs errol ismeri fel, hogy abszolút elérési útról van szó.

Relatív címzés esetén azt mondjuk csak meg, hogy pillanatnyi tartózkodási helyünkhöz, tehát az aktuális katalógushoz képest hol helyezkedik el a megcélzott katalógus, ilyenkor a cd parancs paramétere nem kezdodhet a / karakterrel. Nézzünk egy példát mindezekre! Tegyük fel, hogy /usr/users/janos katalógusban vagyunk, amely alatt található egy src nevu alkatalógus. Hogy ide eljussunk, kiadhatjuk a cd /usr/users/janos/src parancsot, de ezzel egyenértéku lenne a cd src parancs is. Minden olyan esetben, amikor egy katalógust vagy fájlt meg kell nevezni, e kétfajta kijelölési mód egyformán használható. Ha a cd parancsot argumentum nélkül hívjuk meg, akkor a kiindulási katalógusunkba helyez el minket. Ez igen hasznos lehet akkor, ha az állományrendszer egy távoli, sok szinttel odébb lévo pontjáról szeretnénk „hazajutni”. A fájlrendszeren belüli mozgáshoz még két további jelölés is használható: a . (pont) karakterrel az aktuális katalógusra hivatkozhatunk, míg a .. karakterekkel a szülo katalógusra. Ezek a jelölések tetszolegesen kombinálhatóak is. A fentiekre nézzünk egy példát: $ pwd /users/demo $ cd .. $ pwd /users $ cd .. $ pwd / $ cd .. $ pwd /

Page 45: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

47

$ cd users $ cd demo $ pwd /users/demo $ cd / $ cd /users/demo $ pwd /users/demo $ cd /etc $ pwd /etc $ cd $ pwd /users/demo $

Minek nevezzelek? Névkonvenciók

A UNIX állományok és katalógusok nevére vonatkozólag viszonylag laza és kötetlen szabályok vonatkoznak, legalábbis ha a DOS alatt megszokott szigorú 8+3 karakteres névadási megkötésre gondolunk. A UNIX-ban a legfontosabb megkötés az, hogy a fájlnév hossza maximum 14 karakter lehet, de a legtöbb korszeru UNIX fájlrendszernél ez az érték opcionálisan 255 karakterre is állítható. E hosszon belül a fájlnév tetszoleges tagolású lehet; akárcsak a DOS alatt, itt is a . (pont) karakter szolgál szeparátorkarakterként, de ellentétben a DOS-sal, egy fájlnév tetszoleges számú, ponttal leválasztott utótagot tartalmazhat, s legális fájlnév az is, ami egyáltalán nem tartalmaz elotagot, tehát rögtön a pont karakterrel kezdodik. Az alábbiak tehát mind érvényes UNIX állománynevek: alma, alma.korte, alma.korte.gyumolcs, .alma, .alma.23

A fájlnevekben elvileg az ASCII kódkészlet alsó 128 karakterkészlete szabadon használható, mindazonáltal célszeru kerülni azokat a karaktereket, amelyek a shell számára speciális jelentést hordoznak, mert ezek beírása sok gondot okozhat. Tipikusan ezek közé a karakterek közé tartozik: *?@#$!& és a név elején álló '-' jel.. Célszeru tehát az angol ábécé alfanumerikus karaktereire, valamint az aláhúzás és mínusz karakterre korlátozni választásun-kat.2

Nem szabad azonban megfeledkeznünk arról, hogy a UNIX parancsértelmezok esetérzékenyek (case sensitive), azaz különbséget tesznek a nagy- és kisbetuk között. UNIX alatt tehát igenis nem azonos a valami, Valami és a VALAMI fájl!

2 Az utóbbi években megjelent SVR4 UNIX változatok már rendszerint támogatják az úgynevezett Latin-1 kódkészletet, ami az õÕûÛ karakterek kivételével az összes magyar ékezetes betût is tartalmazza, grafikus felület (X11) esetén pedig sok Unix verzió már a teljes magyar betûkészletet tartalmazó Latin-2 kódkészletet is használja. A régi, illetve más kódkészleteket használó rendszerekkel való kompatibilitás érdekében azonban az ékezetes karakterekhasználatát fájlnevekben nem tanácsoljuk.

Page 46: unix kézkönyv

UNIX felhasználói ismeretek

48

Rejtett fájlok

Azokat a fájlokat, amelyeknek a neve a pont karakterrel kezdodik, a UNIX kicsit másképpen kezeli, mint a többit. E fájlok az úgynevezett rejtett fájlok (hidden file), s a katalógusok listázásánál ezek neve nem jelenik meg, csak explicit kérésre. Ennek az az oka, hogy a rejtett fájlok általában adminisztrációs és konfigurációs információkat tartalmaznak, melyek egy-egy felhasználó kiindulási katalógusában kell hogy elhelyezkedjenek, ugyanakkor nem cél-szeru, ha ezek a felhasználó saját anyagaival keverednek. (Ilyen fájlok például a .login, .cshrc, .profile, .logout, amelyek a felhasználó bejelentkezési környezetét állítják be, vagy a .mailrc, .exrc, stb, amelyek egy-egy program indulási konfigurálását végzik.) Az ls parancs például alapértelmezés szerint nem jeleníti meg a pont karakterrel kezdodo nevu rejtett fáj-lokat3. Ha ezekre is kíváncsiak vagyunk, az erre vonatkozó információt a -a opcióval „csal-hatjuk elo”: $ ls -al total 370 drwxr-xr-x 2 demo users 1024 Aug 23 20:29 . drwxr-xr-x 43 root sys 1024 Aug 17 09:40 .. -rw-r--r-- 1 demo users 818 Aug 13 1992 .cshrc -rw-r--r-- 1 demo users 347 Aug 13 1992 .exrc -rw-r--r-- 1 demo users 377 Aug 13 1992 .login -rw-r--r-- 1 demo users 382 Aug 13 1992 .profile -rw------- 1 demo guest 1370 Aug 23 20:29 .sh_history -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 19 Aug 23 20:23 text $

Katalógusok létrehozása: a mkdir parancs

Új katalógusokat a mkdir (make directory) paranccsal hozhatunk létre. Egyszerre több katalógusnevet is megadhatunk, a rendszer mindegyiket létrehozza. Ha a létrehozandó katalógus egy olyan katalógus alatt helyezkedne el, amely maga sem létezik, akkor a katalógus létrehozása sikertelen lesz. Ebben az esetben a -p opcióval érdemes kiadni a mkdir parancsot; ennek hatására a az összes szükséges szülo katalógust létrehozza a rendszer. $ mkdir newdir/new1dir mkdir: cannot access newdir: No such file or directory $ mkdir -p newdir/new1dir $ ls -laR newdir total 6 drwxrwxrwx 3 demo guest 1024 Aug 23 20:41 . drwxr-xr-x 3 demo users 1024 Aug 23 20:41 .. drwxrwxrwx 2 demo guest 24 Aug 23 20:41 new1dir

3 Egyes rendszerek úgy vannak konfigurálva, hogy a superuser jogokkal bíró felhasználó listázáskor a rejtett fájlokat is látja, külön opció megadása nélkül.

Page 47: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

49

newdir/new1dir: total 4 drwxrwxrwx 2 demo guest 24 Aug 23 20:41 . drwxrwxrwx 3 demo guest 1024 Aug 23 20:41 .. $

Katalógusok törlése: az rmdir parancs

Már létezo katalógust az rmdir (remove directory) paranccsal törölhetünk. (Most is megadhatunk több paramétert.) Fontos megjegyezni, hogy e paranccsal csak üres katalógust törölhetünk, ha a katalógusban fájlok vannak, a UNIX nem hagyja a katalógus törlését, elobb törölni kell a fájlokat. (Másik megoldás az rm -r parancs használata, lásd késobb.)

Alapveto fájlkezelo parancsok Ebben a pontban azokat az alapveto parancsokat tekintjük át, amelyekkel állományokat tudunk létrehozni, megtekinteni, másolni, és egyéb muveleteket végrehajtani rajtuk.

Page 48: unix kézkönyv

UNIX felhasználói ismeretek

50

Fájlok létrehozása

Egy állomány létrehozására sok – kezdok számára talán túlságosan is sok – megoldás létezik. Létrehozhatjuk egy szövegszerkeszovel (például ed, vi), kétségkívül ez a leggyakoribb és legkézenfekvobb megoldás. Most viszont néhány "trükkösebb" megoldással kezdünk, melyek egyben segítenek néhány alapveto Unix jellemvonás megismertetésében is. Mindegyik példánkban a "Szép idonk van ma" szöveget próbáljuk meg egy állományba beírni4. Elso megoldásunk az echo parancsra épül. Az echo a DOS alatt megszokott módon muködik (az eltérésekrol majd lesz szó): a parancssorban argumentumként megadott karaktereket tükrözi vissza, alapértelmezés szerint a képernyore. A fájlba írandó szöveget így az echo paranccsal a képernyore már kilistázhatjuk. Félsiker... A teljes sikerhez az átirányítás mechanizmusa segíthet minket. Lehetoség van ugyanis arra, hogy tetszoleges Unix parancs bemenetét vagy kimenetét átirányítsuk máshova, például egy fájlba. Esetünkben a >newfile1 megadással a kimenetet, a képernyo helyett a newfile1 nevu fájlba. És íme, készen is vagyunk: $ echo Szep idonk van ma >newfile1RETURN $

(Ne feledkezzünk meg az egyes sorok végén a kocsi-vissza karakter (RETURN vagy ENTER) leütésérol; a továbbiakban ezt nem jelöljük.) Következo próbálkozásunk a hamarosan részletesebben is ismertetendo cat parancsot használja fel. A cat parancs egy vagy több, argumentumként megnevezett fájl tartalmát listázza ki a képernyore (például cat prog1.c prog2.c). Elso ránézésre ez nem sokat segít rajtunk, hiszen mi nem egy meglévo fájlt akarunk listázni, hanem épp ellenkezoleg, egy még nem létezo fájlt akarunk írni - pestiesen szólva "a többi stimmel...". Minden "jól nevelt" Unix programra igaz azonban, hogy ha nem nevezünk meg állományt, amit be kell olvasnia és fel kell dolgoznia, akkor alapértelmezés szerint (számítástechnikai zsargonnal élve, default értelmezés szerint) a billentyuzetrol (standard input) várja a feldolgozandó adatokat. Hasonlóképpen, explicit kimeneti állománynév hiányában a programok a képernyore (standard output) írnak. Az e konvenció szerint viselkedo programokat szemléletesen szuroknek (filter) nevezik, a késobbiekben még sok szó esik róluk. Ha tehát a cat parancsot bemeneti fájlnév nélkül hívjuk meg, akkor az általunk kívánt módon, a billentyuzetrol bevitt szöveget listázza ki, a kimenetet pedig a már látott módon irányíthatjuk át a kívánt fájlba: $ cat > newfile2RETURN Szep idonk van maRETURN CTRL-D $

(A RETURN karakter használatán kívül most vigyázzunk arra is, hogy a kívánt szöveg begépelése után a CTRL-D karaktert is leüssük, hiszen ez jelzi a parancsértelmezonek, hogy nincs több bemeneti adat.)

4 Alkalmazkodva a mai Unixos valósághoz, ékezet nélküli (éktelen...) formában írjuk be...

Page 49: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

51

A fenti két trükk, a szurési konvenciók létezése és az átirányítás hihetetlenül rugalmassá teszi a Unixot. Végül utoljára egy szövegszerkesztovel is létrehozunk egy fájlt: $ ed newfile3 ?newfile3 a szep idonk van ma . w 18 q $

Az ed editorról külön fejezet szól a könyvben, mostani példánk tényleg csak egy rövid szemlélteto volt. Az ed-nek megadjuk a létrehozandó fájl nevét, a parancs begépelése (és az itt már külön nem jelölt RETURN leütése után) elindul az editor, és úgynevezett parancsmódban várja a parancsokat. (A kérdojeles fájlnév azt jelzi, hogy ilyen nevu állomány eddig nem létezett — már létezo fájl esetén a fájl méretét írja ki, karakterekben számolva.) Az általunk kiadott parancs az a (append), ennek hatására az ed az úgynevezett beviteli módba kerül, s az ebbol való kilépésig mindent, amit gépelünk, változatlan formában az állományba írja. A beviteli módból úgy lehet kilépni, hogy egy sor elején egy önmagában álló . (pont) karaktert írunk be (ez után is kocsi-visszát kell ütni!). Ennek hatására visszakerülünk parancsmódba; ekkor kiadtuk a w (write) parancsot, ez lemezre írja, tehát elmenti a fájl eddig ideiglenes tartalmát (a képernyore kiírja az elmentett fájl aktuális hosszát), végül a q (quit) paranccsal kilépünk az editorból.

Fájlok megtekintése: a cat parancs

A fájlok megtekintésére, pontosabban a képernyon történo megjelenítésre a cat parancs szolgál. (A név onnan származik, hogy ha több fájlnevet adunk meg, akkor ezeket a fájlokat egymásután folyamatosan (concatenated) jeleníti meg... — ennyit a parancsnevek memorizálható jelentésérol...)

A cat parancs a paraméterként megnevezett fájlokat, ennek hiányában pedig a standard inputot, azaz a billentyuzetrol, pipe-ból (csobol) érkezo adatokat listázza ki, folyamatosan, tördelés nélkül. Ez azt jelenti, hogy ha a megjelenítendo állomány nagyobb, mint egy képernyooldal, akkor a szöveg kiszalad a képernyorol, s csak a listázás-felfüggeszto, illetve újraindító gombbal lehet szabályozni a megjelenítést. (E két funkciónak rendszerint a CTRL-S, illetve a CTRL-Q billentyu felel meg.) A cat parancs ezen hiányosságainak kiküszöbö-lésére szolgál a pg és a more, róluk részletesebben a minimanuálban esik szó. Számunkra jelenleg legfontosabb parancsuk pg esetében a RETURN, more esetében a szóköz billentyu; ezek hatására egy képernyooldalnyit lehet elorelapozni.

Fájlok átnevezése: a mv parancs

Page 50: unix kézkönyv

UNIX felhasználói ismeretek

52

Gyakran szükséges egy fájlt máshova helyezni az állományrendszerben, erre a UNIX alatt a mv (move) parancsot használhatjuk5. A legegyszerubb esetben egyetlen fájlt helyezünk át, például a már létezo newfile1 állományunkat file1 néven akarjuk a továbbiakban elérni: $ mv newfile1 file1 $ ls -l newfile file1 newfile not found -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 $

A fenti példában a mv parancs két paramétert fogad, s az elsonek megadott fájlt a másodikként megadott névre nevezi át. Ha a „céltárgy” is közönséges fájl, akkor egyszeru átnevezés történik, az eddig newfile névre hallgató állományt ezentúl file1 néven érhetjük el. (Ha file1 elozoleg nem létezett, akkor a mv parancs automatikusan létrehozza, ha már létezett, felülírja.) Ha a céltárgy katalógus, akkor a mv parancs másképpen muködik: az elso paraméterben megnevezett fájlt a régi néven, a céltárgyként megadott katalógus alá helyezi. Ez esetben lehetoség van arra is, hogy kettonél több paramétert adjunk meg a mv parancsnak: ilyenkor az utolsó argumentumot tekinti a rendszer az átnevezés célkatalógusának, s a többi argumentumban megnevezett fájlokat oda helyezi át. Ha például kiadjuk a mv newfile2 newfile3 newdir parancsot (ne felejtsük el, hogy a newdir katalógust elozoleg már létrehoztuk), akkor newfile2 és newfile3 egyaránt bekerül a newdir katalógusba, változatlan néven: $ mv newfile2 newfile3 newdir $ ls -lR total 362 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:44 newdir -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 -rw-rw-rw- 1 demo guest 19 Aug 23 20:23 text ./newdir: total 6 drwxrwxrwx 2 demo guest 24 Aug 23 20:41 new1dir -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfile2 -rw-rw-rw- 1 demo guest 18 Aug 23 20:44 newfile3 ./newdir/new1dir: total 0 $

Fájlok másolása: a cp parancs

5 A pontosság kedvéért már most jegyezzük meg, hogy ténylegesen az állomány nem mozog a fájlrendszerben, pusztán a rávonatkozó katalógus bejegyzés cserélõdik.

Page 51: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

53

A fájlok másolására a cp (copy) parancs szolgál. Fontos különbség a DOS-hoz szokott felhasználó számára, hogy itt mindenképp legalább két argumentumot meg kell adni, azaz a DOS alatt szokásos copy fájl megadásmód nem megy, a célfájlt vagy katalógust is meg kell adni: az elozo DOS példa ekvivalense így a cp fájl . parancs, ahol expliciten megneveztük az aktuális katalógust, mint célkatalógust. A cp parancs muködése hasonló a mv parancshoz, azaz itt is fájlt fájlba másol, ha a céltárgy fájl, illetve katalógusba helyez, ha a céltárgy katalógus.

Fájlok törlése: az rm parancs

Fájlokat az rm (remove) paranccsal törölhetünk, természetesen most is megadhatunk több fájlnevet a paraméterlistán. Az rm parancs opciói közül gyakran fontos lehet a -f: ennek hatására az egyébként írásvédett fájlokat is törli az rm. A -i (interactive) opció hatására a rendszer egyenként visszaigazolást kér a fájlok törlése elott. (Számos rendszerben ugyanez az opció muködik a mv és a cp parancsnál is.) Végül egy igen hatásos, de egyben igen veszélyes opcióról: a -r hatására rekurzív módon törlodik mind a megnevezett katalógus a benne lévo fájlokkal, mind a fájlhierarchiában belolük származó összes katalógus és állomány. Ellentétben a DOS-sal, a UNIX-ban a fájlok törlése visszafordíthatatlan folyamat — KITÖRÖLT FÁJLT SEMMILYEN MÓDON NEM LEHET HELYREÁLLÍTANI!!!6 Éppen emiatt is, egyes parancsértelmezokben lehetoség van olyan konfigurálásra, hogy törlést, felülírást, és más visszafordíthatatlan muveleteket ne hajtson végre a rendszer, hanem minden esetben kérjen visszaigazolást a „gyanús” muveletekrol. E célt szolgálja a fentiekben említett -i opció is.

Láncok létrehozása: az ln parancs

A UNIX fájlrendszerének egyik jellemzo sajátossága a láncolás (linkelés) fogalma, ami a DOS és más egyfelhasználós operációs rendszerek alatt nem található meg. E mechanizmus arra szolgál, hogy egy adott állományt több néven is el lehessen érni az állományrendszerben. Ha például van egy állományunk text néven, akkor az ln parancs segítségével elérhetjük, hogy mondjuk szoveg néven is hivatkozhassunk rá. $ ln text szoveg $ ls -l total 364 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:44 newdir

6 Kivételek persze minden alól vannak — egyes UNIX platformokra létezik már a Norton Utilities a Quick Unerase funkcióval, és a korszerû grafikus felhasználói felületek is inkább csak „szemétkosárba” rakják a törölt fájlokat, ahonnan azok egy darabig elõnyerhetõek.

Page 52: unix kézkönyv

UNIX felhasználói ismeretek

54

-rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 szoveg -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text $

A láncolás tényérol az ls -l parancs kimenetét vizsgálva gyozodhetünk meg: a valamilyen más néven is láncolt állományok láncszáma (link count) egynél nagyobb érték. Látható, hogy text és szoveg minden paramétere azonos, ugyanakkor láncszámuk egynél nagyobb, s ahogy egyre több láncolást hajtunk rajtuk végre, egyre jobban no. A láncolás mibenlétének megértéséhez érdemes egy kicsit részletesebben megismerkedni a UNIX fájlrendszerének belso szerkezetével7. A 6. ábra mutatja a UNIX fájlrendszer belso felépítését. Minden UNIX fájlrendszer elején megtalálható az úgynevezett szuperblokk, amelyik a fájlrendszer legfontosabb adatait, a belso táblák és azonosítók méretét, stb. tartalmazza. Ezt követi az úgynevezett inode tábla, végül a ténylegesen felhasználható lemezterület, ahol az állományok által lefoglalt és a még szabad lemezblokkok vegyesen helyezkednek el. Az inode név az index-node bevett rövidítése, és a fájlrendszer kialakításának fontos tényére utal, nevezetesen arra, hogy az állományok jellemzoit tartalmazó inode-okat indexként használják a rendszerprogramok. Az inode tábla egy fix méretu tábla, fix hosszúságú rekordokkal, s minden egyes fájlhoz, lett légyen az közönséges adatállomány, vagy katalógus, egy és csakis egy inode bejegyzés tartozik. Az inode tartalmazza az adott fájlra vonatkozó összes lényeges információt, az állomány méretét, típusát, tulajdonosát és csoportját, a hozzáférési jogokat, és az állományt alkotó lemezblokkok fizikai elhelyezkedését a lemezen. Egy információ hiányzik csak az inodeból, mégpedig a szóbanforgó állomány neve: ezt az információt a katalógus(fájl) tartalmazza.

A katalógusfájlban minden egyes fájlhoz, ami az adott katalógusban szerepel, egy bejegyzés tartozik. E rekord nem tartalmaz mást, mint az állomány inode számát, és az állomány nevét. Nézzük meg ezek után, mi történik akkor, amikor mondjuk a /users/demo/text fájlt szeretnénk kilistázni? (Segítségképpen olyan formában (a -i [inode] opcióval) listáztuk ki a szóban forgó fájlokat, hogy az inode értéke is szerepeljen az elso oszlopban.)8 $ ls -ial / total 4926 2 drwxr-xr-x 19 root root 3072 Aug 23 13:40 . 2 drwxr-xr-x 19 root root 3072 Aug 23 13:40 .. 14336 drwxrwxrwx 4 root sys 2048 May 14 21:23 bin 16384 drwxrwxrwx 13 root sys 4096 Aug 10 20:24 dev 10240 drwxr-xr-x 14 root other 5120 Aug 23 19:36 etc 17 -rwxr-xr-x 1 root sys 2351104 Sep 7 1992 hp-ux 12499 drwxrwxrwx 2 root other 24 Apr 22 1992 lost+found 2 drwxrwxrwx 3 root root 2048 Aug 23 22:17 tmp 8194 drwxr-xr-x 43 root sys 1024 Aug 17 09:40 users

7 A fájlrendszer felépítését erõsen leegyszerûsítve tárgyaljuk, s az újabb fájlrendszerek sajátosságaira sem térünk ki itt. 8 Terjedelmi okok miatt a képernyõlistának csak a számunkra fontos részletei szerepelnek.

Page 53: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

55

2 drwxr-xr-x 31 root sys 1024 Aug 10 16:59 usr $ ls -ial /users total 94 8194 drwxr-xr-x 43 root sys 1024 Aug 17 09:40 . 2 drwxr-xr-x 19 root root 3072 Aug 23 13:40 .. 6517 drwxr-xr-x 3 agi users 1024 Jun 29 09:56 agi 20699 drwxr-xr-x 3 demo users 1024 Aug 23 21:00 demo 20719 drwxr-xr-x 4 guest users 1024 Aug 10 19:17 guest .. $ ls -ial /users/demo total 378 20699 drwxr-xr-x 3 demo users 1024 Aug 23 21:00 . 8194 drwxr-xr-x 43 root sys 1024 Aug 17 09:40 .. .. 20818 -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 .. 20816 -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text $

A rendszer eloször megkeresi a gyökér katalógus inode-ját, ez a második inode (#2). Az inode rekordból kikeresi, hogy a lemezen fizikailag hol helyezkedik el maga a / katalógusfájl, ami a gyökérkatalógusban lévo fájlok nevét adja meg. Megnyitja e katalógust, megkeresi benne a users bejegyzést, megnézi az ahhoz tartozó inode számot (#8194), ezt indexként használva az inode táblában megkeresi a /users katalógusra vonatkozó bejegyzést is. Az ebben az inode-ban tárolt adatok alapján megkeresi a lemezen a /users katalógusfájlt, megnyitja, és megkeresi benne a demo bejegyzést, az ahhoz tartozó inode szám (#20699) alapján az inode táblában megkeresi a megfelelo bejegyzést, kiolvassa belole a /users/demo katalógusfájl helyét, megnyitja a katalógust, megkeresi benne a text fájlra vonatkozó bejegyzést, a hozzátartozó inode szám (#20816) alapján megkeresi az inode-ot, és annak alapján megnyitja a tényleges fájlt.

Az egész módszernek az a lényege, hogy három szintu az állomány nyilvántartás, az inode-ok, a katalógusfájlok és a tényleges fizikai állományok között oszlik meg az információ, s a katalógusfájlok csak név és inode információt tartalmazzák, az inode-ok pedig minden egyebet. Ennek alapján értheto meg igazán a láncolás mechanizmusa: amikor egy fájlt linkelünk, nem történik más, mint hogy valamelyik katalógusban egy olyan bejegyzést ho-zunk létre, ami egy már létezo, és más néven is hivatkozott inode-ra mutat. Maga a fájl változatlan marad, a láncolás tényét kizárólag az új katalógus bejegyzés, és az inode-ban megnövelt láncszám jelzi.

Felmerülhet a kérdés, mi van akkor, ha egy láncolt fájlt törlünk? A fentiek ismeretében könnyu a válasz: törléskor a rendszer mindig a láncszám vizsgálatával kezd, ha annak értéke egynél nagyobb, akkor csak a fájlnév bejegyzést törli az adott katalógusból, és eggyel csökkenti a láncszámot. Ha a láncszám egy, akkor ténylegesen is törli az állományt, azaz nemcsak az (utolsó) katalógus bejegyzést szünteti meg, hanem az inode táblából is törli a fájlra vonatkozó bejegyzést.

Nem beszéltünk még arról, hogy mire is jó tulajdonképpen a láncolás? Két nagy elonye van, az egyik a névütközések feloldása, a másik a helytakarékosság.

Page 54: unix kézkönyv

UNIX felhasználói ismeretek

56

6. ábra: A UNIX fájlrendszer belso szerkezete

A névütközések problémája onnan ered, hogy a UNIX verziók eltéro fejlodése miatt ugyanolyan néven kezdtek nevezni más-más parancsokat. Legismertebb példa erre az rsh parancs, ami a System V alapú rendszerekben a restricted shell-t jelenti (ez a szokványos Bourne shell egy korlátozott szolgáltatásokkal bíró változata), a BSD alapú UNIX rendszerekben viszont a remote shell rövidítése, ami a távoli gépeken történo parancsvégrehajtásra szolgál. Mivel a mai rendszerekben mind a két parancs szerepel,

Page 55: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

57

általában csak a katalógusokban definiált keresési sorrend dönti el9, hogy az rsh parancs kiadásakor melyik indul el a ketto közül (mindig a másik, mint amelyiket akartuk, errol saját tapasztalatunk alapján biztosítjuk a Nyájas Olvasót...). Ha viszont valamelyiket egy eltéro névvel láncoljuk, akkor a névütközés problémáját feloldottuk. A restricted shell rendszerint a /usr/bin könyvtárban található, míg a remote shell a /usr/ucb alatt. Adjuk ki az alábbi parancsot (Ehhez superuser jogok kellenek!): $ ln /usr/ucb/rsh /usr/bin/remsh $

E parancs hatására a továbbiakban remsh néven hívhatjuk a remote shell-t, rsh néven a másikat, s a módszer a katalógusok keresési sorrendjétol függetlenül muködni fog.

A linkek mellett szóló másik érv a helytakarékosság. Tegyük fel, hogy van két C nyelvu programunk, amelyek igen hasonló funkciókat látnak el, lényegtelen eltérésekkel. Megtehetjük azt, hogy mindkettot külön-külön lefordítjuk, keletkezik két éktelen nagy bináris programunk, különbözo néven. Ennél sokkal jobb megoldás, ha egy közös, némileg ugyan nagyobb forráskódot fordítunk le egy példányban, a keletkezett bináris végrehajtható program nevét pedig a másik programnévhez láncoljuk. (A program futás közben el tudja dönteni, hogy milyen néven hívták, s az annek megfelelo végrehajtási ágakra futhat.) Látszik, hogy ez esetben csak egy darab nagyméretu program foglal helyet a lemezen, a linkelés helyigénye elhanyagolható (gyakorlatilag a második név katalógus-bejegyzése, ami tipikusan 16 bájt.) A legszebb példa minderre éppen a mv, cp és ln parancs esete. E három program, mint már láttuk, erosen hasonló funkciókat lát el, a paraméterek kiértékelése, számos opció, az inode-okon és a katalógusokon végrehajtandó muveletek nagy része közös, tehát a három program viszonylag jól integrálható. A legtöbb rendszerben ezért egy közös bináris végrehajtható program végzi mindhárom tevékenységet. $ cd /bin $ ls -il mv cp ln 12312 -r-xr-xr-x 3 bin bin 13880 Mar 27 15:07 cp 12312 -r-xr-xr-x 3 bin bin 13880 Mar 27 15:07 ln 12312 -r-xr-xr-x 3 bin bin 13880 Mar 27 15:07 mv $

Mint a fenti példán is látható, körülbelül 26 kbájt helyet nyertünk, hiszen csak egy példányban létezik a 13 kbájt méretu bináris fájl, s ezen kívül csak a két link 32 bájtja foglal helyet.

Ez az eljárás egyébként nemcsak bináris végrehajtható fájloknál, de shellscript-eknél is alkalmazható.

A szimbolikus lánc

9 A keresési sorrend a PATH shell változóval állítható be (lásd a 4. és 11.fejezetet).

Page 56: unix kézkönyv

UNIX felhasználói ismeretek

58

Még egy dologról említést kell itt tennünk, s ez a szimbolikus lánc (symbolic link) fogalma. A UNIX rendszer kétféle láncolási eljárást ismer, a merev és a lágy láncolást (hard and soft link). Az elobbiekben a merev láncolással foglalkoztunk, ennek legfobb jellemzoje az, hogy a láncolt fájl teljesen egyenértéku az eredetivel, hiszen egyazon inode-ra mutat két egyenértéku katalógus bejegyzés, amelyek között nem lehet különbséget tenni.

A „lágy láncolás”, vagyis a szimbolikus link viszonylag késoi újítás a UNIX-ban, a SunOS operációs rendszerbol terjedt el az elmúlt években, de mára már szabványos eleme a UNIX-nak. Lényege, hogy a szimbolikus link katalógus bejegyzése nem a fájl inode-jára mutat, hanem egy olyan különleges fájlra, ami a láncolt fájl nevét tartalmazza. Szimbolikus linket szintén az ln paranccsal hozunk létre, de a -s opciót is meg kell adni: $ ln -s /usr/lib/sendmail.cf sendmail.cf $ ls -l total 364 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 lrwxrwxrwx 1 demo guest 20 Aug 23 23:14 sendmail.cf -> /usr/lib/sendmail.cf -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text $

Látható, hogy a láncszám ebben az esetben nem változott (az csak a hard link esetén no), a fájltípusnál egy 'l' betu szerepel, jelezvén, hogy szimbolikus linkrol van szó, s a fájlnévnél a '->' karakterek jelzik, hogy melyik fájlhoz van láncolva az állomány. Ha a példánkban szereplo sendmail.cf fájlt meg akarja nyitni egy prog- ram, akkor a következo történik: az elozoekben vázolt módon eljut a /users/demo/sendmail.cf fájl inode-jáig; észreveszi, hogy szimbolikus link a fájl típusa; megnyitja a fájlt; kiolvassa a tartalmát, ami jelen esetben /usr/lib/sendmail.cf; a továbbiakban ezt a fájlt keresi és nyitja meg, a már ismert módon. Mire jó a szimbolikus link? Legfontosabb elonye az, hogy lehetové teszi különbözo fájlrendszerek közti láncolást. Ennek megértéséhez néhány szóval meg kell említeni a UNIX fájlrendszer egy érdekes tulajdonságát, mégpedig a mountolhatóság fogalmát. A UNIX fájlrendszere, ahogy azt a felhasználó szerves egésznek látja, nem feltétlenül egységes fizikai szinten is. Ha például több merevlemez van a gépben, ezeken külön-külön UNIX fájlrendszerek vannak installálva, hasonlóképpen, egy CD-n, vagy egy floppy diszken is. Mountolásnak10 hívják azt a tevékenységet, amikor egy ilyen különálló fájlrendszert becsatolunk egy már meglévohöz. A 7. ábrán egy olyan példát mutatunk be, ahol egy floppyn lévo UNIX-os fájlrendszert csatolunk be a gazdagép UNIX fájlrendszerébe, a /mnt katalógus alá. A továbbiakban a floppyn lévo fájlrendszer gyökérkatalógusa a /mnt hivatkozással érheto el, a floppyn lévo /src katalógus /mnt/src néven és így tovább. Magáról a mountolásról több szót nem ejtünk, mert a kérdés leginkább a rendszeradminisztrátorokat érinti, a felhasználó

10 Nincs rá igazán meggyökeresedett magyar kifejezés, mi a továbbiakban (be)csatolásként fogjuk emlegetni.

Page 57: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

59

szempontjából a becsatolás észrevehetetlen kell hogy legyen. A fentiek annyiban érdekesek a számunkra, hogy merev láncolást nem lehet két különbözo mountolt fájlrendszer között létrehozni. A linkelés mechanizmusa ugyanis arra épül, hogy az inode-ok egy állományrendszeren belül egyértelmuen azonosítják a fájlokat, azaz ugyanazon inode-ra történo hivatkozás ugyanazt a fájlt jelenti. Mivel azonban minden egyes önállóan becsatolható fájlrendszerben független a számozás (mindegyikben 2 a root inode stb), az inode érték önmagában nem nyújt elégséges információt arra nézve, hogy a keresett fájl a teljes állományrendszerben hol található. Ezért ha fájlrendszerek közti láncolást próbáltunk meg, az alábbi, vagy hasonló értelmu hibaüzenetet kapunk: $ ln /usr/users/janos/proba proba ln: different file system $

A fenti problémát kikerülhetjük a szimbolikus láncolással, mert a szimbolikus linkben szereplo név akárhova, más állományrendszerbe, nemlétezo, vagy pillanatnyilag el nem érheto helyre is mutathat.

7. ábra: Fájlrendszerek mountolása

A merev láncolás másik hátránya, hogy csak egyedi fájlok linkelését teszi lehetové, katalógusokét nem. Szimbolikus link alkalmazásával egész katalógusokat láncolhatunk át egy paranccsal egy másik fájlrendszerbe, ami gyakran hasznosnak bizonyulhat, ha például a jobb terhelésszétosztás miatt újra kell strukturálni a fájlrendszert, és egész alkalmazáscsomagokat

Page 58: unix kézkönyv

UNIX felhasználói ismeretek

60

helyezünk át más fájlrendszerbe, ugyanakkor mindezt a felhasználó számára észrevétlenül akarjuk végrehajtani.

Hozzáférési jogosultságok E fejezetben a UNIX egyik meghatározó, s a felhasználó munkáját lépten-nyomon érinto jellegzetességével foglalkozunk, nevezetesen a hozzáférési jogosultságokkal (permissions).

Többfelhasználós rendszerekben alapveto fontosságú, hogy az egyes felhasználók saját adatait a lehetoség szerint megvédjük a szándékos vagy szándékolatlan rongálástól, nem is beszélve a magántitok védelmérol és más kérdésekrol. E célok biztosítására a UNIX egy tulajdonosi kategóriák és tevékenységek szerinti engedélyezési rendszert használ, s ennek alapján dönt az állományokhoz való hozzáférés engedélyezésérol, illetve megtagadásáról.

Mint a 2. fejezetben már láttuk, egy UNIX felhasználót a felhasználói azonosítója (uid) azonosít a rendszerben, ezenfelül minden felhasználó valamilyen csoportba is tartozik, így van egy csoportazonosítója (gid) is. Amikor valamilyen módon hozzá szeretnénk férni egy fájlhoz vagy katalógushoz, a rendszer aszerint sorol be minket, hogy milyen tulajdonosi viszonyban vagyunk az adott fájllal: lehetünk tulajdonosa (azonos uid), lehetünk csoporttagok (azonos gid), vagy „egyéb”.

A fájllal kapcsolatos tevékenységek szempontjából három fo csoport van: az állomány olvasása, írása, illetve végrehajtása (katalógus esetében keresése).

A fájlmuvelet elott a UNIX megnézi, hogy melyik tulajdonosi kategóriába esünk, s utána azt, hogy ebben a kategóriában engedélyezett-e vagy sem a végrehajtani kívánt muvelet.

A hozzáférési jogosultságok az ls -l lista alapján szemléltethetoek a legkönnyebben: $ ls -l total 364 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 lrwxrwxrwx 1 demo guest 20 Aug 23 23:14sendmail.cf -> /usr/lib/sendmail.cf -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text

A megjelenített lista baloldali oszlopa tartalmazza a hozzáférési jogosultságokat. Az oszlop legszélso mezoje a fájltípust kódolja, az alábbiak szerint:

- közönséges fájl d katalógus p speciális cso (pipe) l szimbolikus link c karakteres készülékmeghajtó (device driver)

Page 59: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

61

b blokkos készülékmeghajtó

A következo kilenc karakter tartalmazza, háromszor hármas bontásban, a hozzáférési jogosultságokat. Ha egy muvelet engedélyezett, a neki megfelelo betu látszik a listán, ha nem, a '-' karakter jelzi a tiltást. Az 'r' az olvasás (read), a 'w' az írás (write), az 'x' pedig a végrehajtás (execute) jele (más karakterek is szerepelhetnek itt, néhányról hamarosan lesz szó). Az elso hármas csoport a tulajdonos, a második a csoport, végül a harmadik a többiek jogosultságait mutatja. Konkrét példát véve, a fenti listán szereplo file1 egy közönséges fájl ('-' karakterrel kezdodik a lista), amit a tulajdonosa írhat és olvashat, de nem hajthat végre (rw-), s ugyanezen jogokkal bírnak a csoporttagok és a többiek is (Nem túl gyakori beállítás, foleg biztonsági megfontolások miatt!) Másik példa: a newdir egy katalógusfájl ('d' betuvel kezdodik a lista), amelyet tulajdonosa írhat, olvashat és 'végrehajthat' (rwx), s ugyanezek a jogai a csoporttagoknak, valamint bárki másnak is.

Itt álljunk meg egy pillanatra; közönséges fájloknál eléggé magától értetodo az olvasás-írás-végrehajtás fogalma, katalógusnál már nem annyira. Egy közönséges fájl olvasható, ha mondjuk a cat paranccsal ki tudjuk listázni, írható, ha például az ed paranccsal módosíthatjuk, s végrehajtható, ha el tudjuk indítani, s a rendszer értelmezi a benne lévo információkat.

Egy katalógus olvasása azt jelenti, hogy az erre a célra szolgáló paranccsal (ls) olvashatjuk a katalógusfájlt, azaz láthatjuk a benne lévo bejegyzéseket. Egy katalógus akkor írható, ha az erre a célra szolgáló parancsokkal (mkdir, rmdir, mv, cp, rm, ln) bejegyzéseket tudunk létrehozni, módosítani, vagy törölni a katalógusfájlban, illetve törölhetjük/létrehozhatjuk magát a katalógusfájlt. A végrehajtást pedig ez esetben keresésnek kell értelmezni — egy katalógusfájl keresheto, ha a shell egy végrehajtható fájlt megkereshet és elindíthat az adott katalógusfájlból. Ez a jog látszólag hasonló az olvasáshoz, de lényeges különbség van köztük. Legjobban talán egy példán tudjuk szemléltetni: tegyük fel, hogy van egy prog nevu végrehajtható programunk, ami egy olyan katalógusban szerepel, amelyikre engedélyezett az olvasás, de nem engedélyezett a keresés (r--). Ebben az esetben magát a katalógust látjuk ugyan a kilistázáskor, de a benne lévo fájlokat nem. Ehelyett hibaüzeneteket kapunk, akárcsak akkor, ha a végrehajtható fájlt megpróbáljuk elindítani. (Hasonlóképp, ha cd parancsot se tudjuk ilyenkor végrehajtani). Ha a katalógus nem olvasható, de keresheto (--x), akkor az ls paranccsal nem fogjuk látni az állományt, de ha elindítjuk, végre fog hajtódni.

Hozzáférési jogosultságok módosítása: chmod parancs

A hozzáférési jogok módosítása egyrészrol a fenti csoportokra vonatkozó jogosultságok módosítását jelenti (például írásvédelem), másfelol ide tartozik az állomány tulajdonosának, illetve csoportjának megváltoztatása is.

A hozzáférési jogosultságok a chmod paranccsal állíthatóak. E parancsnak két használati módja van, az új jogosultságokat mind oktálisan, mind szimbolikus módon be lehet állítani.

Oktális megadás esetén a parancs valahogy így néz ki:

Page 60: unix kézkönyv

UNIX felhasználói ismeretek

62

chmod [-R] perm-mode file ...

ahol perm-mode a beállítandó új hozzáférési jogosultság. Itt is több fájlnevet lehet megadni szükség szerint. (A -R opcióval rekurzív módon, a megadott katalógus alatti teljes állományrendszeren módosítja a jogosultságokat.) A beállítandó jogokat oktális szám formájában kell megadni, az alábbiak szerint: az olvasás értéke 4, az írásé 2, a végrehajtásé 1, ezeket az értékeket össze kell adni, és így tulajdonosi kategóriánként képzodik három oktális számjegy, ezeket kell beírni. Ha például azt akarjuk, hogy a file1 fájlunkat a tulajdonos tudja olvasni, írni, végrehajtani, a csoporttagok végrehajtani és olvasni, a többiek pedig csak olvasni, akkor a jogosultságok kódolása 4+2+1, 4+1, 4, azaz 754 lesz: $ chmod 754 file1 $ ls -l file1 -rwxr-xr-- 1 demo guest 18 Aug 23 20:42 file1 $

A másik megadási mód a szimbolikus beállítás, ennek a következo a szintaxisa (a szóköz csak a láthatóság miatt szerepel): chmod [-R] who op perm file ...

ahol who a tulajdonosi kategóriát adja meg, lehetséges értékei 'u' (tulajdonos, user), 'g' (csoport, group), 'o' (egyéb, others), illetve 'a' (mindenki, all), ami az elozo hármat magában foglaló alapértelmezés.

perm a megfelelo muvelet, 'rwx' lehet a már látott módon.

op értéke +-= lehet. '+' a megfelelo jog engedélyezését jelenti, '-' a jog letiltását, '=' pedig a jog abszolút értékre állítását. Néhány példa: $ ls -l file1 -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 file1 $ chmod 754 file1 $ ls -l file1 -rwxr-xr-- 1 demo guest 18 Aug 23 20:42 file1 $ chmod u-w file1 # tulajdonosnak írásvédett $ ls -l file1 -r-xr-xr-- 1 demo guest 18 Aug 23 20:42 file1 $ chmod a+x file1 # mindenkinek végrehajtható $ ls -l file1 -r-xr-xr-x 1 demo guest 18 Aug 23 20:42 file1 $

Az alábbi példán az abszolút értékre állítás látható. Normálisan, egy csoportban a '+', illetve a '-' beállítás csak a megnevezett tevékenységet engedélyezi, illetve tiltja, például +w beállítás engedélyezi az írást, de a többi jogot nem változtatja meg. Abszolút értékes megadás esetén a chmod parancs az expliciten nem említett jogokat lenullázza. Alábbi példánkban a tulajdonos olvasási és írási joga engedélyezodik, de a nem szabályzott végrehajtási jog letiltódik: $ chmod u=rw file1 $ ls -l file1 -rw-r-xr-x 1 demo guest 18 Aug 23 20:42 file1 $

Page 61: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

63

A hozzáférési jogosultságok kezelése, mivel az inode rekordban törtnik, biztosítja azt is, hogy egy állomány hozzáférési jogait csak a tulajdonos tudja állítani, még abban az esetben is, ha maga az állomány mások számára is írható.

Tulajdonos- és csoportváltás: chown, chgrp

Lehetoségünk van arra, hogy az általunk birtokolt állomány tulajdonosát és csoportját megváltoztassuk. Ez a chown, illetve a chgrp paranccsal történik. $ chgrp staff file1 $ ls -l file1 -rw-r-xr-x 1 demo staff 18 Aug 23 20:42 file1 $ chown janos file1 $ ls -l file1 -rw-r-xr-x 1 janos staff 18 Aug 23 20:42 file1 $

E két parancs használatakor egyet ne felejtsünk: ha egy állomány tulajdonosi jogait átadtuk, akkor a továbbiakban azt mi nem vehetjük vissza, csak az új tulajdonos dönthet így.

Másodlagos csoportok

A UNIX újabb verziói lehetoséget biztosítanak arra is, hogy egy felhasználó több csoportba is tartozhasson. E másodlagos csoportokat a rendszergazdának kell beírnia a megfelelo konfigurációs fájlba (/etc/group). Amikor csoportot szeretnénk váltani, a newgrp newgroupname parancsot kell kiadnunk. Ha newgroupname számunkra engedélyezett csoport, akkor a következo newgrp parancs kiadásáig az új csoportban leszünk, az annak megfelelo hozzáférési jogokkal11, s az újonnan létrehozott fájljaink is ebbe a csoportba fognak tartozni. A paraméter nélkül kiadott newgrp parancs visszahelyez minket az elsodleges csoportunkba. A másodlagos csoportok a csoportmunkák támogatásánál elonyösek. Így lehetoség nyílik arra, hogy valaki elsodlegesen a saját csoportjába tartozzék, de minden egyes projekt, amelyben résztvesz, külön másodlagos csoportként szerepeljen, s az e projekthez tartozó fájlokhoz csak az e másodlagos csoporthoz tartozók férjenek hozzá.

Gyakorlati példa: a passwd program

Az alábbiakban egy igencsak életszagú példán mutatjuk be a hozzáférési jogosultságok használatát, mégpedig a jelszavak megváltoztatását végzo passwd programon.

11 Eredeti tulajdonosi jogaink érvényben maradnak.

Page 62: unix kézkönyv

UNIX felhasználói ismeretek

64

A passwd program szolgál arra, hogy a felhasználók megváltoztathassák saját belépési jelszavukat. (A parancs használata igen egyszeru, a felhasználónak csak a passwd szót kell begépelni, a parancs kéri a régi jelszót, majd kétszer egymás után be kell gépelni az újat, s a legközelebbi belépéskor már ezt kéri a rendszer.) A UNIX a jelszavakat — számos más információval együtt — a /etc/passwd fájlban tárolja12. Mivel az ebben a fájlban tárolt információk biztonsága létfontosságú az egész rendszer biztonsága szempontjából, ugyanakkor számos olyan információt is tartalmaz, amelyekre a különbözo programoknak szükségük van, e fájl tulajdonosa a root, s a hozzáférési jogok rendszerint rw-r--r-- beállításúak, azaz a rendszergazda írni és olvasni tudja a fájlt, mindenki más csak olvasni. A kérdés ezek után az, hogy ha a fájlt csak a rendszergazda tudja módosítani, akkor hogyan oldható meg az, hogy ha egy „mezei felhasználó” futtatja a passwd programot, akkor meg tudja változtatni a saját jelszavát, amihez nyilvánvalóan a passwd fájl módosítása kell? E problémára a set-uid mechanizmus használata nyújt megoldást. $ ls -l /bin/passwd /etc/passwd -r-sr-sr-x 1 root sys 22208 Mar 27 15:21 /bin/passwd -rw-r--r-- 1 root sys 477 Aug 18 16:58 /etc/passwd $

Ha megnézzük a /etc/passwd adatfájl, és a passwd program végrehajtási jogait, egy eddig még nem látott hozzáférési beállítás szerepel a passwd programnál, mégpedig egy s betu a tulajdonos és a csoport jogoknál. Ez az s a set-uid (set user-id) jog engedélyezését jelzi, ha a tulajdonosi kategóriánál szerepel, illetve a set-gid (set group-id) jogot, ha a csoport kategóriában. Ha e jog engedélyezett, akkor akárki is futtatja a szóbanforgó programot, a futtatás idejére olyan jogokkal fog rendelkezni, mint a program tulajdonosa (illetve mint a programmal egy csoportban lévo bármely felhasználó). Esetünkben ez azt jelenti, hogy ha „mezei felhasználó” kiadja a passwd parancsot, akkor a parancs olyan jogokkal fut le, mintha a tulajdonosa, azaz a root futtatta volna le. Mivel viszont a passwd fájlt a root módosíthatja, „mezei felhasználó” ki tudja cserélni jelszavát; a passwd programból való kilépésekor elveszti különleges jogait, azok csak a passwd parancs futása alatt éltek. A fenti módszer kiválóan alkalmas arra, hogy ellenorzött körülmények között privilégizált jogokat adjanak a felhasználók kezébe, de éppen ezért különleges óvatossággal is kell eljárni, ha egy programot set-uid jogosítványokkal akarunk ellátni; rosszul muködo, hibás program katasztrófákat okozhat a rendszerben, ha mindenki nyakra-fore superuser jogosítványokkal használja.

Mi hol található a UNIX-ban? Állománykonvenciók

12 A legtöbb UNIX verzióban a kritikus password információk már egy külön fájlban, rendszerint a /etc/shadow fájlban találhatóak, de ez most példánk szempontjából érdektelen.

Page 63: unix kézkönyv

3. fejezet Ismerkedés az állományrendszerrel

65

E pontban igen háládatlan dologra vállalkozunk, mégpedig annak áttekintésére, hogy mi és hol található a UNIX fájlrendszerében. E vállalkozás nem is a fájlrendszer mérete vagy bonyolultsága miatt oly nehéz, hanem azért, mert gyakran igen fontos fájlok és katalógusok elhelyezése is rendszerrol rendszerre, verzióról verzióra változik; ami igaz mondjuk HP-UX alatt, az nem igaz SunOS 4.x alatt, még kevésbé egy SVR4 fájlrendszerben, és így tovább. Mivel biztathatjuk a felhasználót? „A változatosság gyönyörködtet” mondás cinikus felidézésén túl csak azzal, hogy a rendszerfájlok elhelyezése alapvetoen azért minden rendszerben hasonló meggondolások alapján történik, másfelol azzal, hogy a lassan egységesülo UNIX-ban — talán — ezek a gondok is csökkenni fognak. Mindenesetre ez az egyik olyan része könyvünknek, ami hangsúlyozottan nem „a” UNIX-ról, hanem a UNIX verziókról beszél. Igyekeztünk a jelenleg legéletképesebb de facto UNIX szabványt, az SVR4 verziót követni tárgyalásunkban, de ahol lehet, megemlítjük az egyéb UNIX verziók eltéro megoldásait13. Éppen a jelentos eltérések miatt, a fájlokat és katalógusokat funkcionális csoportokban soroljuk fel, ez könnyebbé teszi az eltérések bemutatását. Igyekeztünk csak azokra a fájlokra szorítkozni, amivel a felhasználó is szembetalálhatja magát napi munkája során, illetve amelyek alapvetoek a rendszer muködésének megértéséhez.

A katalógusokat a név végén szereplo / jellel azonosítjuk, ennek hiányában fájlra gondolunk, tehát a /etc/ a /etc könyvtárat jelenti, /etc/hosts ennek egy fájlját. A lehetséges névvariációkat a * karakterrel jeleztük, tehát a /user*/ jelenthet ehhez hasonló katalógusokat mint /user/, /user1/, /users/, stb. Kiindulási katalógusok (home directory) /home/ (/export/home/, /usr/user*/, /user*/ stb) Kernel („a” végrehajtható UNIX program) /kernel/unix (/unix, /hp-ux, /vmunix,/stand/unix stb) Felhasználói környezetet konfiguráló fájlok „prototípusai” /etc/skel/ (/usr/lib/) Kritikus rendszerprogramok /sbin/ (/bin/) Egyéb bináris rendszerprogramok /usr/bin/

13 Helyesebb lett volna az „általunk ismert” változatok kifejezés.

Page 64: unix kézkönyv

UNIX felhasználói ismeretek

66

az operációs rendszer felállásának vezérlofájljai /etc/inittab, valamint /etc/init.d/ (a fájlok linkelve a /etc/rc*.d/ katalógusokba) (SunOS és BSD alapú rendszerekben a /etc/rc, és a /etc/rc.* fájlok tartalmazzák az ilyen jellegu információt) adminisztrációs programok és adatfájlok /etc/*/, /usr/sadm/ (az állandó részek), /var/adm/, /var/sadm/ (változó részek, naplózás). (Régebben strukturálatlanul /etc/, valamint /usr/etc/, /usr/adm/ alatt) Készülékmeghajtók, perifériadriverek (fobb készülékcsoportok szerinti bontásban, például dsk/ és rdsk/ a merevlemez, fd/ a floppy, rmt/ a mágnesszalagos egység stb) /dev/ egyes fontosabb programok alapbeállításai /etc/default/ termináldefiníciók /usr/share/lib/terminfo/ (System V: /usr/lib/terminfo/; BSD és SunOS: /etc/termcap) manuálok /usr/share/lib/man/ (/usr/man/) ideiglenes tároló (spool) katalógusok (nyomtatás, levelezés, crontab stb) /var/spool/ (/usr/spool/) ideiglenes tárolóhely /tmp/ (bootoláskor törlodik); /var/tmp/ (/usr/tmp/) programkönyvtárak /usr/lib/*/ (/lib/, /usr/lib/) helyileg használatos programok /usr/local/ (/usr/lbin/, /lbin/ stb) levelezés /etc/mail/ (SunOS, System V: szétszórtan, /usr/lib/sendmail.cf, /usr/lib/aliases, /usr/lib/Mail.rc stb)

Page 65: unix kézkönyv

67

4. FEJEZET

A PARANCSÉRTELMEZO (BOURNE SHELL)

A parancsértelmezo, a shell az, amely az általunk begépelt karaktereket értelmezi és futtatha-tó parancsokká konvertálja. Az átlagos felhasználó számára messze ez a legfontosabb prog-ram a UNIX rendszerben, hiszen bejelentkezéstol kilépésig ezen keresztül kommunikál a rendszerrel, s számára az a UNIX, amit a shell-en keresztül lát. E fejezetben a legelterjedteb-ben használt parancsértelmezo, a Bourne shell legfontosabb tulajdonságaival ismerkedünk meg, azokkal, amelyek nélkülözhetetlenek a rendszer hatékony és otthonos on-line használa-tához. A 10. fejezetben még mélyebb ismereteket szerezhetünk; az ott tárgyalt témák már a shell-programozás területét érintik, azt, hogy hogyan tudunk komplex feladatok ellátására shellscript-eket írni. A C shell használatát a 11., a Korn shell-ét pedig a 12. fejezetben vesszük.

Mivel külön fejezetben, részletesen és funkcióik szerint csoportosítva foglalkozunk a gyak-rabban használt UNIX parancsokkal és segédprogramokkal, ezért e fejezetben csak a leheto legkevesebb programot szerepeltetjük, a hangsúlyt tudatosan a shell mechanizmusaira fektet-ve, és nem a programok gazdagságára.

Speciális karakterek Az alábbiakban arról a látszólag triviális problémával foglalkozunk, hogy hogyan kell begé-pelni parancsokat a UNIX shell alól, melyek azok a speciális karakterek, amiknek valamilyen speciális jelentése van.

A legtöbb billentyu, amelyet leütünk, „normális”, azaz nyomtatható és megjelenítheto karak-ter, néhánynak azonban speciális jelentése van. Ezek közül a legfontosabb a RETURN billen-tyu, mely a más rendszerekben megszokott módon egy begépelt sor végét jelzi a rendszernek: a képernyon ez úgy jelentkezik, hogy a kurzor a következo sor elejére áll.

A vezérlokarakterekrol

A return vagy újsor (newline) karakter, melyet a RETURN billentyuvel generáltunk, az ún. vezérlokarakterek (control character) közé tartozik, amelyek a begépelt illetve a képernyon

Page 66: unix kézkönyv

UNIX felhasználói ismeretek

68

megjelenítendo adatok értelmezését szolgálják a rendszer számára. A return funkció minden esetben rendelkezik saját billentyuvel, a legtöbb vezérlokarakter azonban a CONTROL (néha CTRL) billentyu és egy másik billentyu egyideju lenyomásakor fejti ki hatását. A return funkció elérheto például a CTRL-M billentyukombináció lenyomásával is. A fenti módon ge-nerálható vezérlokarakter sorozatokat a továbbiakban a CTRL-X írásmóddal jelezzük. A begépelt karaktereket a shell egy belso tárolóhelyen gyujti mindaddig, amíg a RETURN karakter lenyomásával nem jelezzük, hogy a parancssor begépelésével végeztünk, s átadtuk feldolgozásra a shell-nek. Vannak azonban bizonyos karakterek, amelyeket speciális javító funkciókhoz vannak rendelve, ezeket rögtön feldolgozza a rendszer, az újsor karakter beérke-zése elott is. A legfontosabb ilyen karakterek a (karakter)törlés és a sortörlés.

Karaktertörlés

A törlés (erase) funkcióhoz rendelt karakter leütésekor törlodik az a karakter, amelyiken a kurzor állt. Az „os” UNIX-okban e funkciót a '#' karakter töltötte be, s mivel akkortájt csak teletype jellegu terminálok léteztek, a képernyon nem is törlodött a szóban forgó karakter. Az alábbi példa egy ilyen esetet illusztrál: $ pwc#d /users/demo $

A modern megjelenítok kialakulásával persze természetessé vált, hogy a törlo karakter leüté-sekor a képernyon is törlodik a karakter. A konvenciók változásával a '#' karakter helyett a DEL billentyu használata lett általános, de sokan — kivált a személyi számítógépekrol át-szokva — a BS (backspace, <-) karaktert favorizálják. A választás teljes mértékben rajtunk múlik — a vezérlokarakterek is, mint oly sok minden más, a UNIX alatt szabadon átkonfigu-rálhatóak.

Sortörlés

A másik speciális karakter a sortörlés (kill) funkcióbillentyu: ennek hatására a shell az addig begépelt összes karaktert eldobja, s a továbbiakban begépelt karaktereket úgy kezeli a rend-szer, mintha azokkal kezdtük volna a bevitelt az újsor karakter után. Megint csak termináltól függ, hogy e billentyu lenyomásakor törlodik-e a sor a képernyon, vagy pedig a következo sor elejére áll-e a kurzor. E funkciót hagyományosan az '@' („at”) karakterhez szokták rendelni, ez azonban az elektronikus levelezésben okoz problémákat, ezért manapság inkább a CTRL-U karakter a használatosabb.

Speciális jelentés elnyomása

Page 67: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

69

Gyakran szükségünk lehet arra is, hogy a fenti funkciókhoz rendelt karakterek speciális jelen-tését elnyomjuk, és igenis, egy backspace vagy CTRL-U karaktert akarunk leírni. Ilyenkor a „semlegesítendo” karakter elott egy '\' (backslash) karaktert kell leütnünk1. A backslash ka-rakter bármelyik, eddig még nem tárgyalt karakter speciális jelentését is elnyomja. Ha magát a backslash karaktert kell valahol szerepeltetni, akkor duplázva kell beírni. Eléggé szerencsét-len és értelemzavaró módon „escape” mechanizmusnak is szokták nevezni ezt a funkciót; a név NEM az ESC karakterre utal!

Programfutás megállítása

A megszakítás (intr) funkcióhoz rendszerint a CTRL-C, néha a DEL, néha a BREAK gombot szokták rendelni; ennek lenyomására a futó program futása megszakad.

Háttérben futó programok megállítása

Számos UNIX rendszerben lehetoség van a háttérfolyamatként indított programok futásának felfüggesztésére. A CTRL-Z karakterhez rendelt susp funkcióbillentyu hatására a háttérben futó folyamatok futása ideiglenesen felfüggesztodik és lehetoség nyílik végleges lelövésükre, netán elotérben történo továbbfuttatásukra.

Fájlvége

A legfontosabb egyéb funkciók egyike a fájlvége (eof), ami rendszerint a CTRL-D karakter-hez van rendelve. E karakter azt jelzi a rendszernek, hogy nincs több adatbevitel (input). El-lentétben az eddig szerepeltetettekkel, e karakter speciális jelentése csak akkor érvényesül, ha egy sor elején, közvetlenül egy újsor karakter után szerepel.

A fájlvége karakterrel bármelyik, adatbevitelt váró programnak jelezhetjük a bevitel végét, ez programtól függoen gyakran a programból történo kilépéssel egyenértéku. Legkézenfekvobb példa a UNIX alóli kilépés, a logout: hacsak másképpen nincs konfigurálva rendszerünk, az eof karakter lenyomására kiléptet minket a UNIX alól. Ennek az a magyarázata, hogy beje-lentkezésünkkor egy shell indul el, ami kilépésünkkor hal el, illetve fordítva is, a login shell elhalásakor kikerülünk a rendszerbol. Mivel viszont egy shell-nek az a feladata, hogy a bil-lentyuzetrol érkezo karaktereket feldolgozza és értelmezze, a „nincs több input” értelmu CTRL-D hatására login shell-ünk elhal, s így kiléptet a rendszerbol.

1 Ugyanezt a hatást érhetjük el a semlegesítendõ karakter, vagy karakterek szimpla vagy dupla aposztrofpár ('...', „...”) közé zárásával.

Page 68: unix kézkönyv

UNIX felhasználói ismeretek

70

Képernyolistázás

Ha akkora adathalmazt listázunk ki, ami túlszalad a képernyon, a stop, illetve a start funkció-billentyukkel lehet a listázást felfüggeszteni, illetve újraindítani. Rendszerint a CTRL-S a megállításhoz, és CTRL-Q az újraindításhoz rendelt karakter2.

A parancssor feldolgozása A parancszáró RETURN karakter után a shell megpróbálja végrehajtható parancsokká bonta-ni a beérkezett karaktersorozatot. Elso lépésben a begépelt sort szavakra bontja. A shell szó-nak tekinti mindazon karakterek egymást követo sorozatát, amelyet „fehér karakterek” vá-lasztanak el egymástól. A fehér karakterek közé tartozik a szóköz, a tabulátor és maga az új-sor karakter. Ha tehát azt gépeljük be a shell promptnál, hogy alma korte repa

akkor ezt a shell három szóra fogja bontani, alma lesz az elso, korte a második, és repa a harmadik.

Fontos megemlíteni, mert tapasztalataink szerint a DOS felol érkezett felhasználók gyakran elfeledkeznek róla, hogy mindig kell legalább egy fehér karaktert ütni az egyes szavak közé, mert különben a shell nem az általunk szándékozott módon fogja értelmezni a parancsokat. Egynél több szóköz vagy tabulátor az esetek túlnyomó többségében nem okoz problémát, hiá-nyuk viszont mindig, ezért már itt biztatjuk az olvasót, hogy használja nyugodtan a szóköz billentyut, s a „CD\” jellegu DOS-os pongyolaságokról felejtkezzen el, legalábbis amíg UNIX-os gép terminálja elott ül...

A szavakra bontott parancssorból az elso szót fogja a shell a végrehajtandó parancs nevének tekinteni, az összes többit pedig argumentumnak, amelyeket (némi feldolgozás után) végre-hajtáskor átad a parancsnak. Fenti példánkban tehát a végrehajtandó parancs az alma lesz, s argumentumként a korte és a repa szó adódik át: hogy ezekkel a program mit kezd, az már az o dolga, a shell-t nem érinti.

Az argumentumok két csoportra bonthatóak, az opciókra és az egyéb paraméterekre. Az opci-ók révén egy program viselkedését tudjuk megváltoztatni, például az ls parancsot a -l opció-val rábírni arra, hogy hosszú formátumú listázást adjon. Az egyéb paraméterek rendszerint a fájlnevek, illetve esetlegesen az opciókhoz tartozó értékek.

A UNIX-ban a '-' karakter jelzi, hogy opciót adunk meg. Az opciók általában egy karakterbol állnak, s ebben az esetben több is leírható egymás után, például az ls -l -t egyenértéku az ls -lt

2 Grafikus, ablakkezelõ rendszerrel ellátott felhasználói felület esetén rendszerint lehetõség van arra, hogy az ab-lak tartalmában oda vissza lapozzunk a görgetõsáv (scrollbar) segítségével, ilyenkor a fenti mechanizmus használa-ta szükségtelen.

Page 69: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

71

paranccsal. Az opciók megadásának mindazonáltal nincs egyértelmuen kialakult és rögzodött módja, így néha furcsaságokba ütközhet az ember: egyes programok például meglehetosen idegesen reagálnak, ha a felhasználó csoportosítva írja az opciókat, mások épp ellenkezoleg, az egyenként írtakat tekintik illegálisnak. Szerencsére mindez elég ritka, inkább csak a vi-szonylag régi programok egy részénél fordul elo.

Gyakran elofordul, hogy egy opció után számértéket vagy egy karakterstringet is meg kell ad-ni, például az archiváló programnál a blokkméretet, editornál a scriptfájl nevét, stb. Itt sem egységes a gyakorlat, van olyan program, ahol az opcióbetuvel egybe kell írni a számértéket vagy fájlnevet (például a pr parancsnál a 80 karakteres sorszélesség beállítás pr -w80), más-hol viszont az opcióhoz tartozó értéket külön szóba kell írni (például a tar parancsnál a blokkméretet a tar cb 20 formában lehet megadni). A közmegegyezés abba az irányba mutat, hogy az utóbbi megadás a jobb, annál is inkább, mert ebben az esetben a paramétereket váró opciókat is lehet egy csoportos opcióként megadni, ilyenkor az opcióbetuk utáni elso paramé-ter az elso olyan opcióhoz tartozik, amelyik értéket igényelt, a következo paraméter a máso-dikhoz, és így tovább. Egy példa: a tar -cfvb /dev/rmt/0m 20 src

parancsban a -c opció nem igényel paramétert; a -f opcióhoz a /dev/rmt/0m fog tartozni, a -v megint csak nem igényel, a -b opcióhoz pedig a 20 érték tartozik; az utolsó paraméter, src pe-dig nem egy opcióhoz tartozó érték, hanem önmagában álló paraméter (példánkban ez az archiválandó könyvtár neve).

Idonként szükségünk lehet arra is, hogy a meghívott programnak egyértelmuen jelezzük, vége az opciómegadásnak, most már kizárólag egyéb paraméterek következnek. Ilyen eset lehet például, amikor ilyen-olyan okból egy '-' karaktert szeretnénk paraméterként átadni; normál esetben a meghívott program ezt mindenképpen opciókezdo karakterként próbálja értelmezni, s elég nehezen lehet csak e kényszerképzetérol lebeszélni. Újabb verziójú parancsértelmezokben a '--' (mínusz-mínusz) karakterszekvencia jelzi a shellnek, hogy a további argumentumokra nem kell opciófeldolgozást végrehajtania. Egy példa: ha véletlenül létrehoztunk egy -f nevu állományt, az rm -f paranccsal hiába is próbálkozunk kitörölni, mert rendszerünk opciónak veszi a -f argumentumot. Az rm -- -f megadás már egyértelmuvé és végrehajthatóvá teszi kívánságunkat.

Több parancs egy sorban Az eddigiek során elég szó esett arról, hogy a parancsok határoló karaktere az újsor karakter, az-az ennek leütésével jelezzük a shell-nek, hogy lezártunk egy parancsot, s megkezdheti annak fel-dolgozását. Az újsor karakteren kívül azonban használhatjuk a pontosvesszo (;) karaktert is az egyes parancsok elválasztására. Ha egyetlen parancsot gépelünk, ennek különösebb értelme nin-csen, a shell addig úgysem veszi be a parancsot, amíg újsor karaktert nem ütöttünk: $ date Thu Mar 28 14:39:45 MET 1991 $ date;

Page 70: unix kézkönyv

UNIX felhasználói ismeretek

72

Thu Mar 28 14:39:50 MET 1991 $

A pontosvesszo használatával azonban lehetoség van arra, hogy több parancsot adjunk meg ugyanabban a parancssorban: $ date; who Thu Mar 28 14:40:04 MET 1991 root console Mar 28 12:56 tmp vt01 Mar 28 13:52 guest vt02 Mar 28 14:37 $

Fenti példánkban két új paranccsal is megismerkedtünk. A date parancs kiírja az aktuális dá-tumot és idot a rendszerben (rendszeradminisztrátorok a beállítást is végrehajthatják ugyanez-zel a paranccsal.

A who paranccsal a rendszerbe bejelentkezett felhasználók listáját kaphatjuk meg: az oszlo-pos formátumú kiírásban az elso oszlop a felhasználó bejelentkezési nevét adja meg, a máso-dik annak a terminálnak a neve, vagy rövidítése, amelyiken az illeto bejelentkezett. Végül a harmadik oszlop a bejelentkezés idopontját mutatja meg.

A standard perifériák és átirányításuk Láttuk, hogy a programok túlnyomó többsége a billentyuzetrol várja a bemeneti adatokat (in-put), és a képernyore küldi az eredményeket (outputot).

E két perifériát, azaz a billentyuzetet és a képernyot a UNIX standard be- és kimeneti csator-nának nevezi, és kis egész számokkal lehet rájuk hivatkozni. Pontosabban fogalmazva, a UNIX három standard be- és kimeneti csatornát definiál, a standard bemenetet (stdin, 0); a standard kimenetet (stdout, 1) és a standard hibacsatornát (stderr, 2). A standard bemenet alapértelmezés szerint a billentyuzet, a kimenet és a hibacsatorna pedig a képernyo. Az utób-bi ketto szétválasztásának alapesetben nincs értelme, hiszen mind a futó programok eredmé-nyét, mind az esetleges hibaüzeneteket látni szeretnénk.

Nyilvánvaló, hogy nem sokra megyünk olyan programokkal, amelyek csak a billentyuzetrol tudnak adatokat fogadni, és csak a képernyore tudnak kiírni — e gondon segít az átirányítás (redirection). Ennek lényege az, hogy tetszoleges programot utasíthatunk arra, hogy bemene-tét ne a billentyuzetrol várja, illetve eredményeit ne a képernyore írja. E mechanizmusnak a UNIX alatt kitüntetett jelentosége van: gyakorlatilag minden, a standard outputra író program kimenete átirányítható egy tetszoleges állományba, s hasonlóképp, bármelyik program, ame-lyik a standard inputról olvas, tetszoleges állományból veheti inputját. A bemenet átirányítá-sának jele a '<' karakter, a kimeneté a '>' karakter.

Például az alábbi parancs a katalógus tartalmát nem a képernyore listázza ki, hanem a file ne-vu állományba teszi:

Page 71: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

73

$ ls -l >file $ cat file total 364 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 0 Aug 29 16:46 file -rw-r-xr-x 1 janos guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir .. -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text $

A '<' és '>' karakterek mindkét oldalán tetszoleges számú szóköz karaktert tehetünk, de el is hagyhatjuk oket. Az alábbi parancssorozat eloször létrehozza az akarmi és a semmi nevu fáj-lokat, majd a cat parancs segítségével összemásolja oket egy harmadik, temp nevu állomány-ba: $ echo "Ez akarmi ***" >akarmi $ cat akarmi Ez akarmi *** $ echo "*** Ez semmi" > semmi $ cat semmi *** Ez semmi $ cat akarmi semmi>temp $ cat temp Ez akarmi *** *** Ez semmi $

A kimenet átirányításakor, ha az állomány, amibe az átirányítást eszközöltük, nem üres, akkor az újonnan beleíródó adatok felülírják a tartalmát. Ennek elkerülésére szolgál a '>>' karakte-rekkel jelzett additív átirányítás; ekkor az átirányított adatok a meglevokhöz fuzodnek: $ cat akarmi semmi >>temp $ cat temp Ez akarmi *** *** Ez semmi Ez akarmi *** *** Ez semmi $

A bemenet átirányítására egy példa: egy megírt levelet többeknek szeretnénk postázni. A le-velezésre használt mail parancs elvileg interaktív muködésu, azaz meg kell adni a parancssor-ban a címzett nevét és a levél tárgyát, majd a RETURN után begépelhetjük a levél szövegét. Ha viszont már készen lévo levelet szeretnénk küldeni, akkor a levelet a bemenet átirányításá-val adjuk meg a program számára: $ mail -w janos geza <level $

Page 72: unix kézkönyv

UNIX felhasználói ismeretek

74

Az átirányítás segítségével lehetoség nyílik például a bejelentkezett felhasználók ábécé-sorrendben történo kilistázására: $ who >temp; sort <temp guest vt01 Mar 28 20:58 guest vt02 Mar 28 20:58 root console Mar 28 20:58 $

A fentebbi példában használt sort parancs a bemenetrol olvasott adatokat rendezi alfabetiku-san, vagy számos más, opcionálisan beállítható szempont alapján.

A csovezeték (pipe) Az elozo példában az egyik program kimenetét használta fel a másik program bemenetként, egy ideiglenes állomány közbeiktatásával. Ennek és az ehhez hasonló feladatoknak a megol-dására szolgál a csovezeték (pipe), amely annakidején a UNIX egyik alapveto újítása volt. A pipe, melynek jele a '|' karakter, az egyik program kimenetét a másik program bemenetével köti össze. Az elozo példaprogram tehát így írható: $ who | sort guest vt01 Mar 28 20:58 guest vt02 Mar 28 20:58 root console Mar 28 20:58 $

(Noha a pipe a DOS alatt is szerepel, de ott csak szimulálja a parancsértelmezo a cso jellegu muködést, az átadandó adatok egy, a felhasználó elott rejtett fájlba kerülnek. Ennek az a kö-vetkezménye, hogy a második program csak akkor tud olvasni a „pipe”-ról, ha az elso már be-fejezte annak írását. A UNIX esetében a pipe-olást egy FIFO oldja meg, amit váltakozva az elso program tölt, a második kiolvas, és ez addig folytatódik, amíg az elso programnak van mit tölteni.) A pipe-ok többszörözhetoek is, azaz láncszeruen egymásra épülve adhatják tovább az adato-kat egymásnak. Nézzük meg például az alábbi programot: $ who | sort | pr -t -3 guest vt01 guest vt02 root console $

Ez a parancs eloször kilistázza a bejelentkezett felhasználókat, majd ábécésorrendbe rendezi oket, végül az utolsó fázisban háromhasábos formában nyomtatja ki oket. A következo parancs azt adja meg, hogy a guest nevu felhasználó hány terminálon van beje-lentkezve: $ who | grep guest | wc -l 2

Page 73: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

75

$

E feladathoz két, eddig még nem említett hasznos UNIX segédprogramot használtunk fel. A grep karaktersorozatoknak, stringeknek állományokban történo keresésére szolgál, a wc (word count) pedig alapértelmezés szerint a bemenet sorainak, szavainak és karaktereinek számát adja meg. A -l opció megadásával csak a sorok számát írja ki. Nem utolsósorban a pipe-ban való használhatóság követelménye miatt olyan a legtöbb UNIX parancs viselkedése, hogy ha nincs állománynév megadva, ahonnan inputját vennie kell, ak-kor automatikusan a standard inputról olvas. (Számos programnál lehetoség van arra, hogy a standard inputról való olvasást explicit módon jelezzük, hagyományosan egy önmagában, op-cióbetu nélkül álló — jellel.)

Page 74: unix kézkönyv

UNIX felhasználói ismeretek

76

Programok csoportosítása zárójelezéssel A () zárójelek használatával lehetoségünk nyílik programok csoportosítására. Ennek önmagá-ban nem sok értelme volna, hiszen a date; who

illetve a (date; who)

eredménye között nincs különbség; mindjárt lesz azonban, ha az eredményt egy pipe-on ke-resztül akarjuk vezetni: a pipe precedenciája ugyanis nagyobb, mint a pontosvesszoé, s ezért ha két vagy több egymást követo program eredményét akarjuk pipe-ra kötni, szükség van a zárójelekre: $ date; who Tue Apr 02 16:12:22 MET 1991 root console Apr 2 08:00 guest vt01 Apr 2 08:00 guest vt02 Apr 2 16:12 $ date; who| wc Tue Apr 02 16:12:43 MET 1991 3 15 111 $ (date; who) | wc 4 21 140 $

A fenti példán is látszik, hogy zárójelezés nélkül csak a who parancs kimenete került a wc bemenetére, zárójelezés után viszont a date parancsé is.

A standard error Ha a parancsok hibaüzeneteiket a standard kimenetre írnák, akkor csovezetékbe kötött prog-ramoknál egyrészrol nem lennének láthatóak a képernyon (márpedig pont a figyelemfelhívás a funkciójuk), másfelol nem várt eredményeket adnának, amint más programok bemenetére kerülnének. Mindezek miatt a hibacsatornát a normál kimenettol eltéroen kezeli a UNIX. A hibacsatorna alapértelmezés szerint szintén a képernyohöz van rendelve, de akkor is úgy ma-rad, ha a standard outputot átirányították. (Természetesen szükség esetén a standard error csa-torna is átirányítható, csak éppen errol is explicit módon kell rendelkezni.) Az alábbi példapárban a három összefuzött parancs közül a sort rossz opciót kapott, emiatt a terminálra ki is írta a hibaüzenetet, de a standard kimeneten keresztül láthatólag semmit nem adott át ebbol a wc programnak, mert az, csövön keresztül kapva ugyanazt a kimenetet, 0 ér-téket mutat. $ who | sort -X

Page 75: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

77

sort: invalid use of command line options $ who | sort -X | wc -l sort: invalid use of command line options 0 $

Csövek elágaztatása: a tee parancs

A cso kapcsán még egy hasznos segédprogramról kell említést tenni, s ez a tee nevu program. A tee bemenetét szintén a standard inputról veszi, de kimenetét két helyre küldi; egyrészt a standard outputra, másrészt a paraméterként megnevezett állományba. Ez elsosorban prog-rambelövéseknél igen hasznos szolgáltatás. A -a opció hatására a paraméterként megadott ki-meneti állományt nem írja felül a tee, hanem hozzáfuzi az újabb kimeneti adatokat. $ date | tee temp | wc -l 1 $ cat temp Thu Mar 28 14:40:04 MET 1991 $

Folyamatkezelés A 2. fejezetben már láttuk a program és a folyamat közti különbséget, ami alapvetoen úgy összegezheto, hogy a folyamat (process) nem más, mint egy program éppen futó példánya, a programkód és a futáskor hozzárendelt adatterület, a maga processz-példányonként egyedi tartalmával. (Szemléletes hasonlattal élve, amikor többen használják mondjuk a cat paran-csot, az egyes elindított folyamatok programkódja közös (hiszen ugyanaz a program fut), de az adatszegmens más és más, attól függoen, hogy melyik folyamat melyik fájlt listázza, hol tart a listázásban stb.) Ebbol az is leszurheto, hogy a UNIX, mint többfelhasználós és többfel-adatos rendszer alatt, a folyamat az egyik legalapvetobb egység, amivel az operációs rendszer dolgozik. Az alábbiakban a folyamatkezeléssel foglalkozunk egy kicsit, különös tekintettel a háttérben futtatásra és a folyamatok idozített végrehajtására.

Háttérfolyamatok és folyamatazonosítók

Láttuk az elozoekben, hogy egy parancssorban több programot is elindíthatunk, ha pontos-vesszovel elválasztva gépeljük be oket. Ez esetben a programok (pontosabban: a folyamatok) egymástól teljesen függetlenül de, egymás után, szekvenciálisan futnak le, amíg az elso pa-rancs által indított le nem fut, a következo nem indul el. A UNIX azonban egyidejuleg több program futtatására is képes. Tegyük fel, hogy van egy idoigényes programunk, amelynek futtatását nem feltétlenül tudtuk az ebédszünetre idozíteni, s valami más hasznosat is szeret-

Page 76: unix kézkönyv

UNIX felhasználói ismeretek

78

nénk csinálni, amíg az fut. Ez esetben a háttérben futó folyamatként elindíthatjuk a progra-mot, elindítása után a parancsértelmezo rögtön visszaadja a promptot, s nem kell a program befejezodésére várni, futtathatunk valami mást. $ grep ilyenugyselesz /* >./eredmeny & 1540 $

A fenti példában az ilyenugyselesz stringet keressük a gyökérkatalógus állományaiban, s az eredményt az aktuális katalógusban az eredmeny nevu állományba íratjuk. A parancssor vé-gén az '&' jel jelzi, hogy a programot a shell háttérfolyamatként (background process) indít-hatja, s nem kell a befejezodését megvárnia. A felhasználó számára ez abban jelentkezik, hogy rögtön visszakapja a promptot, s a rendszer kiír egy számot. Ez a szám az adott processz folyamatazonosítója, az úgynevezett process-id (PID). Ezt az azonosítót a késobbiekben az adott processzre való hivatkozásokban használhatjuk. Mivel a folyamat a legalapvetobb futási entitás a rendszerben, a UNIX minden egyes folyamathoz egy egyedi azonosító értéket ren-del, amelyet az adott üzemciklusban (tehát a következo bekapcsolásig) egyidoben senki más nem kap meg.

Folyamatok lelövése: a kill parancs

A process-id leggyakoribb alkalmazása az, amikor egy túl sokáig futó, netán hibás, vagy nem az általunk várt eredményt adó háttérprocesszt le akarunk állítani (nem háttérben futó progra-mot a CTRL-C billentyuvel lehet leloni). Erre a célra a kill parancs szolgál. Paraméterként a „lelövendo” folyamat PID-jét kell megadni: $ kill 1540 $

Szükségtelen mondani, hogy a felhasználó — hacsak nem rendelkezik superuser jogosítvá-nyokkal — csakis a saját maga által elindított folyamatokat loheti le.

Folyamatok kilistázása: a ps parancs

Gyakran elofordul azonban, hogy az ember már nem emlékszik a megállítandó folyamat azo-nosítójára. A radikális megoldások hívei a kill 0 paranccsal az összes saját futó folyamatukat abortálhatják (magának a bejelentkezéskor elindult login shell-nek a kivételével)3, van azon-ban ennél finomabb módszer is, nevezetesen a ps parancs segítségül hívása. A ps alapértel-mezés szerint az érdeklodo felhasználó futó folyamatainak legfontosabb adatait listázza ki, köztük a folyamatazonosítót is; ennek birtokában már célzottan hívható meg a kill.

3 Több rendszerben a login shell is megöli.

Page 77: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

79

$ ps PID TTY TIME COMMAND 113 vt02 0:01 sh 203 vt02 0:00 ps 140 vt02 0:00 sh 141 vt02 0:00 tee 142 vt02 0:00 sh $

Az eredményül kapott listán az egyes folyamatok azonosítója, a folyamathoz rendelt terminál neve, a folyamat futási ideje és végül a neve látható. A -ef opciók megadásával a rendszerben éppen aktív összes folyamatról kapunk részletes listát, ennek elemzése azonban túlmutat té-mánkon. (Az viszont sajnálatos módon idevág, hogy a ps parancs listája megint csak rend-szerrol rendszerre eltéro lehet; a fenti opciók például a System V alapú rendszerekre érvénye-sek, BSD UNIX verzióknál a ps -ax parancs generál hasonló eredményeket. De ezen túlmeno-leg is, az egyes paraméterek kiírási helye és/vagy megadásának módja eltérhet, célszeru mindig utánanézni az online manuálban.)

Programfuttatás kilépés után: a nohup parancs

Különösen számításigényes programoknál jönne jól, ha az ember a háttérben elindíthatná programját, aztán kilépne a rendszerbol, és nem kellene várnia a program befejezodését. Nor-mál körülmények között erre nincs mód, mert ha a felhasználó kilép a rendszerbol, minden olyan folyamata elhal, amit az o login termináljáról indítottak el, tehát a háttérfolyamatok is. Ennek elkerülésére szolgál a nohup (no hang-up) parancs. Alábbi példánkban a nohup paranccsal indított sokaigfutok program a felhasználó kilépése után is tovább fog futni, eredményét pedig, mivel nem lesz terminál, ahova írhatná, a nohup.out nevu állományba rakja (errol a rendszer gondoskodik, nem nekünk kell megadni): $ nohup sokaigfutok & 641 $ Sending output to nohup.out

(A nohup parancsot is háttérfolyamatként kell futtatnunk, ha vissza akarjuk kapni a promptot.)

Természetesen a nohup se véd a rendszer lekapcsolása ellen, s egy már futó program utóla-gos átmentésére sem alkalmas4.

Programok idozített végrehajtása: az at parancs

4 Változnak az idõk: vannak már ma is olyan laptop (!) UNIX gépek, amik váratlan kikapcsoláskor elmentik pilla-natnyi állapotukat, s bekapcsolás után automatikusan ugyanabba az állapotba kerülnek, beleértve az összes éppen futott alkalmazást, mint ahol kikapcsoláskor voltak...

Page 78: unix kézkönyv

UNIX felhasználói ismeretek

80

Rendkívül hasznos lehetoség, ha parancsainkat és alkalmazásainkat tetszoleges idopontban, elore ütemezve, netán periodikusan tudjuk végrehajtatni. A standard Unix két parancsa nyújt erre lehetoséget: az at az elore ütemezett, egyszeri parancsvégrehajtást teszi lehetové, a crontab pedig rendszeresen ismétlodo parancsok indítását végzi. (A legtöbb rendszerben a crontab csak a privilégizált felhasználók számára hozzáférheto, ezért itt nem foglalkozunk vele.)

Az at parancs a következoképpen indítható (a CTRL-D itt is a ténylegesen leütendo vezérlokaraktert szimbolizálja): $ at time tetszőleges parancs(ok) begépelhetőek, lezárás CTRL-D karakterrel CTRL-D $

Az alábbi példával azt illusztráljuk, hogy hogyan lehet az éjszakai lemezkihasználtsági álla-potokat kilistázni: # at 0030 echo Diszkhasznalat: df -k echo CTRL-D warning: commands will be executed using /usr/bin/sh job 746749800.a at Tue Aug 31 00:30:00 1993 #

Példánkban három parancsot adtunk meg, éjszaka fél egykor történo végrehajtásra, egy echo, egy df és még egy echo parancsot. (A df -k parancs hatására a gép összes állományrendszeré-nek lemezkihasználtságáról kapunk információkat, mekkorák az egyes lemezek, mekkora a foglalt és a szabad részek aránya, mind kilobájtban, mind százalékosan megadva.)5

A bemenetet záró CTRL-D megadása után a shell figyelmeztet, hogy az általunk megadott parancs(oka)t egy Bourne shell fogja végrehajtani, végül kilistáz egy azonosítót. Ha a mega-dott idopontban éppen nem vagyunk bejelentkezve, a program(ok) futásakor kapott esetleges eredményt és a hibaüzeneteket levélben küldi el nekünk.

Természetesen itt is lehet átirányítást használni, így például a végrehajtandó parancsokat egy állományba szerkeszthetjük, s az at parancsot úgy indítjuk, hogy a standard input helyett e fájlból olvasson: $ at 3am <napitorles $

Az idopont megadásakor elég laza szabályok vannak, az at parancs elég intelligens ahhoz, hogy a legtöbb angol idopont- és dátummegadási módot felismerje (megint csak a szerzok ta-

5 BSD Unix verzióban a df -k megfelelõje a bdf parancs.

Page 79: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

81

pasztalata, hogy azért azt az egyet éppen nem szeretik, amit mi igen...). Lehetoség van a tomorrow, today, midnight, now stb szavak használatára is. Csak ízelítoül, az alábbiak mind érvényes és használható dátumformátumok: at 0815am Jan 24, at 8:15am, at now + 1 day, at now next day, at 5pm Friday, stb.

Arról nem ejtettünk még szót (s ha van az olvasók között olyan, aki szereti rögvest begépelni a példákat, az valószínuleg elátkozott már ezért minket), hogy a legtöbb rendszerben nem mindenkinek engedélyezett az at parancs használata sem. Még pontosabban fogalmazva, alapbeállítás szerint csak a root és egyéb privilégizált felhasználók futtathatnak idozített pa-rancsokat.

A hozzáférések szabályzása két fájl révén történik, az at.allow és az at.deny fájlokkal. (Ezek rendszerint a /usr/spool/cron, vagy a /usr/lib/cron katalógusban találhatóak.) Az elobbibe azo-kat a felhasználókat lehet beírni, akik használhatják az at parancsot, utóbbiba pedig azokat, akiknél ezt kifejezetten tiltjuk. A megfelelo fájlok üresen hagyásával lehet beállítani a két szélsoséget, miszerint mindenki, illetve senki sem jogosult az idozített parancsvégrehajtásra. E két fájlt természetesen csak privilégizált felhasználók módosíthatják.

A fájlnevek behelyettesítése a shell-ben Láttunk már néhány olyan karaktert, amelynek valamilyen speciális jelentése van a shell szá-mára; a pontosvesszo a parancsokat határolja, a kerek zárójelek a parancsok csoportosítása-kor használatosak, a '&' jel a háttérben futtatást jelzi, stb. Ezeket a karaktereket szokták me-takaraktereknek nevezni, mivel betu szerinti értelmükön túlmutató jelentésük is van. Ebben a pontban néhány újabb metakarakterrel ismerkedünk meg, amelyek a shell egy igen fontos me-chanizmusában, a fájlnevek behelyettesítésében kapnak szerepet.

Ha a shell a parancssor valamelyik szavában a kérdojel (?) vagy csillag (*) karakterek vala-melyikét találja, ezeket helyettesíto karakternek értelmezi, s az oket tartalmazó szót megpró-bálja az aktuális katalógusban lévo fájlnevekre illeszteni.6 A '?' karakter bármelyik karakterre illeszkedhet, a '*' karakter pedig tetszoleges számú és tetszoleges karakterre illeszkedik. Ha a shell talált az adott argumentumra illeszkedo fájlnevet, akkor behelyettesíti azt az argumen-tum helyére. Nézzük meg mindezt néhány példán! Tegyük fel, hogy katalógusunk az alábbi fájlokat tartalmazza: $ ls FULL-INDEX file newdir newfilee2 sendmail.cf text akarmi file1 newfile semmi temp $

6 Ha az adott szó elérési útra jellemzõ karaktereket (‘/’, ‘.’) tartalmaz, akkor az így meghatározott katalógusban próbál meg illeszteni.

Page 80: unix kézkönyv

UNIX felhasználói ismeretek

82

Most próbáljunk meg helyettesíto metakaraktereket tartalmazó argumentumokat megadni az ls parancsnak, s nézzük meg, ezeket milyen fájlnevekre tudja ráilleszteni a shell. Elso pél-dánkban a shell az 'f' betuvel kezdodo, utána egy tetszoleges karaktert tartalmazó, majd az 'le' karakterekre végzodo nevu fájlt keres a kurrens könyvtárban; egy ilyet talált, a file nevut: $ ls f?le file

Hasonlóképpen a második minta a 'file' betukkel kezdodo, és még egy tetszoleges karaktert tartalmazó nevet keres — ez a file1 állományra illeszkedett. $ ls file? file1

A következo példa a 'file' karakterekkel kezdodo, s bármivel folytatódó nevekre illeszkedik: ebbe belefér az az eset is, ha nulla darab karaktert vesz a shell, ezért illeszkedik a file állo-mánynévre is! $ ls file* file file1

Az alábbi példa az akármivel kezdodo, a 'file' szócskával folytatódó, s akármivel befejezodo nevekre illeszkedik: $ ls *file* file file1 newfile newfilee2

Ez a példa az akármivel kezdodo, a 'file' karakterek után egy tetszoleges karaktert tartalmazó nevekre illeszkedik: $ ls *file? file1

Utolsó példánkban egy olyan mintát adtunk meg, ami semmilyen fájlnévre nem illeszkedik a kurrens katalógusban — ilyenkor a shell változatlanul hagyja az argumentumot, azaz az ls pa-rancs az x* nevet fogja megkapni, s joggal panaszkodik, hogy ilyen fájl nem létezik: $ ls x* x* not found $

A '?' és a '*' karaktereket dzsóker-karaktereknek is nevezik, a fájlnév behelyettesítésben betöl-tött szerepükre utalva.

Még egy dzsóker-mechanizmus is rendelkezésre áll, ez a karakterosztály megadásának lehe-tosége. A szögletes zárójelek '[...]' között megadott karakterek egy karakterosztályt definiál-nak: az ezt tartalmazó minta illeszkedni fog bármelyik olyan karakterre a fájlnevekben, ame-lyik a karakterosztályban szereplo bármelyik karakterrel azonos. Egy példa: az a[xyz] minta illeszkedni fog az ax, ay és az nevekre. Lehetoség van továbbá arra is, hogy az ASCII kód-készlet szerint egymás után következo sok karaktert a mínuszjel felhasználásával, tól-ig for-mában adjuk meg. Az src[0-9] minta illeszkedni fog az src0, src1, ... src9 fájlokra. Vigyázat,

Page 81: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

83

egy karakterosztály megadása mindig egy karakterre illeszkedik, ha például kétjegyu számok-kal végzodo mintát szeretnénk megadni, valahogy így kéne: src[0-9][0-9].

A karakterosztályoknál karakterek ellentettjét is kereshetjük, a '^', illetve újabb shellekben a '!' karakterek megadásával. Így tehát a '[!a-z]' bármely olyan karakterre illeszkedik, ami nem kisbetu. (Ha magát a '^' vagy a '!' karaktert szeretnénk tagadni, az elso helyen kell szerepeltetni a karakterosztályon belül, pl. '[!!a-z]' minden olyan karakterre illeszkedik, ami nem felkiáltójel, vagy kisbetu.)

Van még egy apróság, amire nem árt, ha vigyázunk a mintamegadásokkor: akárcsak az ls pa-rancs, a shell is eltéroen kezeli a rejtett fájlokat, és alapértelmezés szerint a '.', illetve a '*' jel hatálya nem terjed ki a névkezdo pont karakterre. Ennek az a következménye, hogy a '*' minta például minden létezo fájlnévre illeszkedni fog, kivéve a rejtetteket. Ha azokat is látni akar-juk, explicit módon meg kell adni a szókezdo pont karaktert a mintában, például ls .*. (ennek viszont az a következménye lesz, hogy a kurrens és a szülo katalógusra való hivatkozás ('.' és '..') is illeszkedik a mintára, tehát azok tartalmát is kilistázza az ls. Megoldás? ls .[!.]*

Végül ismét csak nyomatékosan emlékeztetünk arra, hogy a fájlnév behelyettesítést mindig a shell végzi el, s a meghívott program már a behelyettesített fájlneveket kapja meg: egyik elozo példánknál maradva, amikor mi az ls file* parancsot adtuk ki, a shell két illeszkedo állománynevet talált (file és file1), s ezeket behelyettesítette az eredeti parancsba. Amikor tehát a shell ténylegesen meghívja majd az ls parancsot, úgy fogja látni, mintha mi az ls file file1 parancsot adtuk volna ki, nem fog tudni arról, hogy hogyan nézett ki a parancssor eredeti mivoltában.

A DOS és UNIX metakarakterek

A DOS-t ismerok figyelmébe ajánljuk a DOS és a UNIX metakarakter értelmezése közti fon-tos különbséget: míg a UNIX konzekvensen csinálja a mintaillesztést, addig a DOS ezt — fi-noman szólva — eléggé elnagyoltan utánozta le. A DOS alatt például a mintában szereplo ka-rakterek az elso '*' karakter után figyelmen kívül maradnak (mindez külön-külön igaz az állo-mánynévre, illetve az utótagra). A UNIX shell azonban végignézi a mintát, s csak olyan állo-mányneveket helyettesít be, amelyek a teljes mintának megfelelnek. Tehát ha van egy abc és egy ade nevu állományom, a DOS az a*c mintára mindkettot megtalálja (rosszul!), míg a UNIX csak az abc nevut.

Metakarakterek semlegesítése Gyakran van szükség arra, hogy a metakaraktereket literálisan, azaz szószerint lehessen érte-ni, a shell ne próbálja oket interpretálni. Ennek legegyszerubb módja, ha egyszeres idézojelek (' ... ') közé zárva írjuk az adott metakaraktereket, ez esetben több karakter is szerepelhet az idézojelek között. A másik megoldás, hogy a backslash karakterrel egyenként tiltjuk le a me-

Page 82: unix kézkönyv

UNIX felhasználói ismeretek

84

takarakterek interpretációját. Végül a harmadik módszer, hogy idézojelek között (" ... ") rejtjük el a karaktereket. Utóbbi esetben viszont bizonyos interpretációkat mégiscsak végez a shell (ezekrol késobb még lesz szó), ezért inkább az elso ketto az ajánlható. Az alábbi példában háromszor három csillagot íratunk ki az echo paranccsal, s mindhárom csoportot más-más semlegesíto módszerrel védtük le: $ echo '***' \*\*\* "***" *** *** *** $

Ha az idézojelek valamelyikét szeretnénk literálisan megkapni, akkor a másik fajta idézojel közé zárva írjuk: $ echo "'" ' $

Ha újsor karaktert szeretnénk a szövegben megadni, akkor azt valamelyik idézojelpár közé kell zárni: $ echo 'Ladies & > gentlemen' Ladies & gentlemen $

A második sor beírásakor látható > karakter az úgynevezett másodlagos prompt (secondary prompt): ez íródik ki olyankor, amikor a parancs befejezéséhez a shell újabb szövegbevitelt vár a felhasználótól. E módszer arra alkalmas, hogy a bevitel során megorizzük az eredeti többsoros jelleget. Ha az újsor karaktert nem idézojelpárok közé zárjuk, hanem a backslash karakterrel tesszük literálissá, akkor az újsor karaktert magát is eldobja a shell. Ily módon lehetoségünk van hosszú sorok bevitelére a rendszerbe: $ echo abc\ > def\ > ghi abcdefghi $

Megjegyzések Lehetoség van megjegyzések elhelyezésére is a shell által feldolgozott inputban. A szókezdo '#' karakter után következo szöveget a shell a sor végéig figyelmen kívül hagyja: $ echo hello #there! hello

Page 83: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

85

$ echo hello#there! hello#there! $

A szókezdo jellegét azért hangoztattuk, mert ha egy argumentumban, attól fehér karakterrel el nem választva szerepel a '#' jel, a shell az argumentum részének tekinti, mint a példában lát-ható is volt.

Shell script-ek Az eddigi ismeretek alapján most érkeztünk el arra a pontra, hogy használható shell progra-mokat írjunk. Ennek folyamatát kísérjük végig most egy olyan program létrehozásával, ame-lyik a kurrens katalógusban található fájlok számát írja ki (egyszeruség kedvéért tekintsünk most el a rejtett fájloktól és más egyéb nyalánkságoktól). Nevezzük el programunkat nf-nek (number of files). Ha parancssorban kiadva szeretnénk a kívánt eredményt megkapni, az alábbi parancsot kell végrehajtani: $ ls | wc -w 11 $

A feladat ezek után csak az, hogy hogyan lehet ezt a parancsszekvenciát önálló parancsként indítani? Elso lépésként egy állományba kell bevinni a fenti szöveget, ezt megtehetjük például az ed editorral is, de legegyszerubb, ha egy echo paranccsal átirányítjuk a kívánt szöveget az nf ne-vu állományba: $ echo 'ls | wc -w' >nf; cat nf ls | wc -w $ ls # futtatas elotti ellenorzes FULL-INDEX file newdir newfilee2 semmi temp akarmi file1 newfile nf sendmail.cf text $ ls | wc - w # eggyel tobb kell hogy legyen nf miatt 12 $

(Kérdés: Ha nem zárjuk aposztrófok közé a parancsszöveget, mi kerül nf-be? És miért?) A nf állomány elkészülte után a futtatást többféle módon is intézhetjük. Az elso két megol-dásnál magának a parancsértelmezonek a sokszor idézett meghatározásából indulunk ki: a shell egy olyan program, amely a standard inputot olvassa, az onnan érkezo karaktereket megpróbálja végrehajtható parancsokként értelmezni és végrehajtani. Ha viszont a shell ugyanolyan „kutyaközönséges” program, mint a többi, akkor itt is átirányíthatjuk a bemene-tet, hogy ne a billentyuzetrol várja, hanem egy végrehajtható parancsokat tartalmazó fájlból — azaz nf-bol:

Page 84: unix kézkönyv

UNIX felhasználói ismeretek

86

$ sh <nf 12 $

A második megoldás azon alapul, hogy a shell is futtatható úgy, hogy a paraméterként átadott fájl tartalmát olvassa be, és próbálja meg végrehajtani: $ sh nf 12 $

Mindkét fenti módszer használható, de valaki joggal mondhatja azt, hogy „unfair” a shell pa-rancsokat tartalmazó programok, és a mondjuk C nyelvrol fordított, binárisan végrehajtható programok futtatásában ilyen különbséget tenni, hiszen az utóbbiak minden külön sh begépe-lése nélkül indíthatóak. Ezen meggondolás alapján a UNIX shell minden olyan állományt, amelyik nem bináris állomány, de végrehajtható (a megfelelo hozzáférési jog engedélyezett), úgynevezett shell fájlnak (más néven shellscript) tekint, a benne lévo szöveget pedig végrehajtandó shell parancsoknak tekinti, s aszerint próbálja meg végrehajtani. Hogy egy állományt végrehajthatóvá tegyünk, a már ismert chmod paranccsal kell csupán a végrehajtást engedélyezo hozzáférési bitet „bebillenteni”, s a shellscript már futtatható is: $ chmod +x nf $ ls -l nf -rwxrwxrwx 1 demo guest 11 Aug 30 21:03 nf $ nf 12 $

Programargumentumok, shell változók Az elobbiek folyamán már futólag találkoztunk a shell változóival (shell variables, parameters), például ilyen volt az átdefiniálható prompt, vagy az állományok keresését bizto-sító PATH változó. A shell-változók két fajtáját különböztetjük meg, egyik a hagyományos programozási nyelvekben megszokotthoz hasonló változó, a másik az úgynevezett pozicionális paraméter. A közönséges shell-változónak akár parancsszinten, akár egy programban értéket lehet adni, azt le lehet kérdezni, illetve módosítani. A pozicionális paraméterek azok az argumentumok, amelyeket végrehajtáskor átad a shell a meghívott shellscriptnek (például a myprog 23 /tmp parancsban két pozicionális paraméter, a 23 és a /tmp adódik át myprog-nak). Ellentétben a közönséges shell-változókkal, a pozicionális paraméterek értékét a felhasználó soha nem vál-toztathatja meg, azokat csak lekérdezni tudja. A pozicionális paraméterekrol a shell progra-mozás kapcsán még lesz szó, egyelore a közönséges shell-változókkal foglalkozzunk. Egy shell-változónak igen egyszeruen adhatunk értéket, a neve után egy egyenloségjelet gé-pelünk, s utána a változó (új) értékét. Az egyenloségjel körül nem lehetnek szóközök, s maga a shell-változó értéke is csak egy szó lehet, így ha szóközt vagy tabulátort is tartalmaz, akkor

Page 85: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

87

valamelyik idézojelpárral kell körülvenni. Az alábbi példa az elsodleges promptot definiálja át, melynek változója PS1: $ PS1='Yes, dear? ' Yes, dear? pwd /users/demo Yes, dear? PS1='$ ' $

A shell-változók értékét a set paranccsal lehet lekérdezni (a set maga számtalan, igen eltéro funkcióval rendelkezo parancs, a shell-programozásról szóló fejezetben több alkalmazási le-hetoségére visszatérünk még). $ set EDITOR=vi HOME=/users/demo IFS= LOGNAME=demo MAIL=/usr/mail/demo MAILCHECK=600 MANPATH=/usr/man:/usr/contrib/man:/usr/local/man PAGER=pg PATH=/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:usr/openmail/bin:. PS1=$ PS2=> SHELL=/bin/sh TERM=sun-cmd TZ=MET-1METDST $

A fenti példában látható változók rendszerváltozók, amelyeket bejelentkezésünkkor már beál-lított a shell. Ha saját magunk definiálunk változókat, azok is láthatóak a listán. A foglalt nevek nagybetusek, míg az általános konvenció szerint a felhasználó által definiált shell-változók rendszerint kisbetusek.

Hogy a shell-programozásban hogyan és mire használjuk a shell-változókat, arra a 10. fejezetben részletesen visszatérünk. Itt és most csak olyan kérdésekkel foglalkozunk, amelyek az interaktív shell használat során elokerülhetnek. Nézzünk néhány példát, hogy mire is használhatunk egy shell-változót. Ha például van egy gyakran „látogatott” katalógusunk, akkor annak nevét egy shell-változóban elmenthetjük, s a továbbiakban nem kell annak teljes nevét begépelnünk, elég, ha a shell-változó nevét adjuk meg a cd parancs paramétereként: $ dir=/usr/catman/u_man/man1 $ echo $dir /usr/catman/u_man/man1 $ cd $dir $ pwd

Page 86: unix kézkönyv

UNIX felhasználói ismeretek

88

/usr/catman/u_man/man1 $

A fenti példából látható, hogy a var shell-változó értékére a $var módon hivatkozunk.

A rendszer által állított fontosabb shell-változók

Az alábbi táblázatban a rendszer által állított legfontosabb shell-változókat tekintjük át. HOME A cd parancs default értéke, a felhasználó saját (bejelentkezési) katalógu-

sára állítja be a rendszer. PATH A parancsok keresési útvonalát állítja be, azaz hogy a shell hol keresse a

végrehajtandó fájlokat. Az egyes elemeket kettospont (:) választja el egy-mástól.

CDPATH A cd parancs számára beállítható keresési útvonal, szintén kettosponttal szeparálva. Ha e változó be van állítva, relatív elérési útvonalak megadá-sakor a shell a CDPATH-ban felsorolt összes elérési útvonalhoz megpró-bálja illeszteni az általunk begépelt relatív nevet, és ha talált ilyet, oda vált. Például ha CDPATH=/abc, akkor ha kiadunk egy cd bin parancsot, a shell megnézi, hogy létezik-e /abc/bin katalógus, s ha igen, oda vált.

MAIL Az e-mail postaüzeneteket tároló katalógus neve. MAILCHECK Megadja (másodpercekben), hogy milyen gyakran ellenorizze és írja ki a

shell az új posta érkezését. Alapértelmezése 600. Ha értéke 0, minden pa-rancs kiadása után, a prompt kiírása elott ellenoriz.

PS1,PS2 Az elsodleges és másodlagos prompt. A default értékek a „$”, illetve „>”. TERM A felhasználó által használt terminál típusa. USER LOGNAME A felhasználó neve (bejelentkezési azonosítója). IFS Belso mezohatárolók: azon karakterek, amelyek a shell szavait elválaszt-

ják (default megadása a szóköz, a tabulátor és az újsor karakterek). TERMINFO A curses és terminfo terminálfüggetlen képernyokezelo rutinok számára

definiál külön katalóguselérési útvonalat. TZ A helyi idozóna. Nagyon gyakran van szükségünk arra, akár interaktív módban, akár script-ekben, hogy a saját kiindulási katalógusunkra hivatkozzunk; rendszerint azért, mert onnan kiinduló katalógus- vagy fájlneveket szeretnénk megadni. Ilyenkor igen hasznos (és gyakran kevesebb gépelést is eredményez) a HOME változó használata. A legfontosabb érv azonban az, hogy ha bármi-lyen oknál fogva megváltozik környezetünk, vagy egy általunk írt shellscript-et más gépre szeretnénk átvinni, a HOME változó használata biztosítja a rendszerfüggetlenséget — akár-hol, akármilyen UNIX-os gépen is dolgozunk, a HOME változó értéke be lesz állítva, s nyu-godtan felhasználhatjuk. A PATH változó a végrehajtandó programok keresési útvonalát adja meg. A shell mindig balról jobbra értékeli ki, tehát az elsonek megadott katalógus- névben keres eloször, aztán jön a következo és így tovább. Ellentétben a DOS-sal, itt a kur-

Page 87: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

89

rens katalógusnév nem értetodik bele a keresési útvonalba! Ezért, ha a PATH változónkban nem szerepel, ne lepodjünk meg, hogyha a shell nem látja meg az „orra elott lévo” végrehaj-tandó fájlt a kurrens katalógusban, s „Command not found” vagy hasonló hibaüzenetet ad. A kurrens katalógust vagy a '.' karakterrel, vagy egy üres mezovel adhatjuk meg. (Meg kell je-gyeznünk, hogy biztonsági megfontolásokból nem célszeru a kurrens katalógust megadni a keresési útvonalban, de ha mégis rászánjuk magunkat, mindenképpen a legvégére tegyük, va-lahogy így: PATH=/bin:/usr/bin:/usr/local/bin:$HOME/bin:.

A TERM változónak fontos szerep jut mindannyiszor amikor valamilyen editort futtatunk, képernyon listázunk, vagy távoli gépekre jelentkezünk be. Ezekben az esetekben ugyanis mindig arra van szükség, hogy valamilyen terminálfüggo megjelenítést hajtsunk végre, már-pedig számtalan fajta terminál létezik, a legbutább teletype jelleguektol elkezdve a nagyfelbontású grafikus képernyokig. Hogy a terminálfüggetlen muködést meg lehessen olda-ni, a UNIX egy terminál (és nyomtató) adatbázist is tartalmaz. BSD UNIX rendszerekben ez egyetlen hatalmas fájl, a /etc/termcap, System V alapú rendszerekben egy külön katalógusfa, rendszerint a /usr/lib/terminfo katalógus alatt, ahol minden gyakoribb termináltípus jellemzoi szabványos módon fel vannak sorolva. Ha egy programban ezek után kiadjuk például a „menj a képernyo HOME (bal felso) pozíciójába” parancsot, a program a TERM shell-változó alapján meghatározza terminálunk típusát, a terminfo vagy termcap adatbázisban megnézi, hogy az adott terminálnál milyen karakterszekvencia felel meg a kívánt muveletnek, majd végrehajtja azt.

Shell-változók exportja

Egy létrehozott shell-változó mindig ahhoz a shell-hez tartozik, amely létrehozta, és a shell gyermekeinek, tehát a shell által indított programoknak nem adódik át automatikusan, mint ezt az alábbi példa is mutatja: $ x=Hello $ echo $x Hello $ sh # uj shell-t inditunk $ echo $x $ exit # most vissza az elozo shell-be $ echo $x Hello $

Az elobbiek miatt, ha azt akarjuk, hogy egy változót a leszármazott processzek is megkapja-nak, azt exportálni kell, ami az export var parancs kiadásával történik: $ x=Hello; export x $ sh

Page 88: unix kézkönyv

UNIX felhasználói ismeretek

90

$ echo $x Hello $

Pozicionális paraméterek

A pozicionális paramétereket, pontosabban azok értékét a $n megadással jelöljük, ahol n egész szám kell hogy legyen (régebbi shell implementációk csak 9 pozicionális paramétert engedélyeztek, $1-tol $9-ig). $1 a shellscriptnek átadott elso paraméter, $2 a második, stb. $0 hagyományosan a shellfile nevét tartalmazza. Az elozoekben szerepelt példát véve, ha a myprog 23 /tmp

parancsot adjuk ki, akkor a myprog shellscript a következo pozicionális paramétereket kapja: $0=myprog, $1=23, $2=/tmp. Ennek ismeretében most az nf program példájára hozzuk létre az nf1 programot, amelyik nem a kurrens, hanem tetszoleges katalógusban található fájlok számát írja ki. E shellscriptnek egy paramétere lesz, mégpedig a listázandó katalógus neve — a megfe-lelo helyen (tehát az ls parancs paraméterezésénél) — a $1 jelöléssel hivatkozunk rá: $ echo 'ls $1 | wc -w' >nf1; chmod +x nf1 $ ls; nf1 FULL-INDEX file1 newfilee2 ravasz temp akarmi newdir nf semmi text file newfile nf1 sendmail.cf 14 $ $ ls /usr; nf1 /usr adm diag local nettest pub tsm archive doc lost+found news sam users backup etc mail old softbench bin include man openmail spool boot keysh netdemo pc-dos sysver contrib lib netls preserve tmp 32 $

Az eddig tárgyaltakon kívül a Bourne shell még az alábbi shell változók értékét is állítja: # A meghívott (futó) program pozicionális paramétereinek száma. Programciklusokban

használható jól, például a script hívási paramétereinek (argumentumlistájának) feldolgozásakor.

? A legutolsónak végrehajtott parancs visszatérési értéke. $ A futó shell folyamatazonosítója. Shellprogramokban ideiglenes fájlnevek képzésére

használható, miután egy program folyamatazonosítója egyedi érték. Ha tehát shell scriptünkben egy ideiglenes fájlnak mondjuk a /tmp/myscript.$$ nevet adjuk, akkor

Page 89: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

91

garantált, hogy akárhány felhasználó is futtatja egyidoben ezt a scriptet, mindegyik script más-más néven hozza létre az ideiglenes állományait.

! A legutolsónak indított, háttérben futtatott processz folyamatazonosítója.

Paraméterbehelyettesítés

Arról már volt szó, hogy egy var shellváltozóra (paraméterre) a $var vagy ${var} megadással hivatkozhatunk; a shell ilyenkor megpróbálja behelyettesíteni a változó értékét. Az alábbiakban a behelyettesítések néhány speciális esetét nézzük meg.

${var:-value} Ha a var változó be van állítva, s értéke nem nulla, behelyettesítéskor a shell ezzel az értékkel dolgozik; ellenkezo esetben value-t adja vissza. Így lehet default paramétereket beállítani shell scriptekben, ha argumentum nélkül hívták meg oket. Például ha a ${1-/tmp} hivatkozást használjuk, ha scriptünket paraméter nélkül hívják meg, $1 helyett a /tmp értéket adja vissza.

${var:=value} Ha a var változó nincs beállítva, vagy nullváltozó, var-t value-ra állítja, s ezután helyettesíti be var értékét. Például ${name:=first_name} esetén, ha a name változó nincs beállítva, first_name változóértékét fogja behelyettesíteni.

${var:?value} Ha var be van állítva és nem nullváltozó, behelyettesíti értékét, egyébként kiírja a value stringet és kilép a shellbol. (Ha value nem lett beállítva, a "parameter null or not set" üzenetet kapjuk.

${var:+value} Ha var be van állítva és nem nullváltozó, value-t adja vissza, egyébként nem helyettesít be semmit.

A fenti változóhivatkozások megadhatóak a kettospont nélkül is, ebben az esetben a shell csak azt vizsgálja, hogy a változók be vannak-e állítva, az értéküket nem ellenorzi.

Page 90: unix kézkönyv

UNIX felhasználói ismeretek

92

Parancsbehelyettesítés E ponton a UNIX shell egyik legelegánsabb és számtalan helyen használható mechanizmusá-ról lesz szó, mégpedig a parancsbehelyettesítésrol (command substitution). Ennek lényege az, hogy egy program eredményét nem a kimenetre küldjük, hanem egy másik program para-méterlistájába illesztjük.

A parancsbehelyettesítéshez a behelyettesítendo parancsot és paramétereit `prog ...` formá-ban, visszafele dolo szimpla aposztrofok (accent grave) között kell megadni. Egy példa: vala-mi elegáns formában ki szeretnénk íratni, hogy hány felhasználó van bejelentkezve rendsze-rünkben. Ezt a következo paranccsal érhetjük el: $ who otto pty/ttys0 Sep 2 07:53 demo pty/ttys1 Sep 2 09:26 kgy pty/ttys3 Sep 2 09:10 janos pty/ttys5 Sep 2 09:11 janos pty/ttys6 Sep 2 09:26 $ echo "Jelenleg `who | wc -l` felhasznalo van bejelentkezve" Jelenleg 5 felhasznalo van bejelentkezve $

Ez a mechanizmus a UNIX shell egyik legsokoldalúbban használható eszköze, példákat a shell-programozásról szóló fejezetben látunk majd.

Környezetalakítás: a profile fájlok Az eddigiek során megismerkedtünk a Bourne shell legalapvetobb funkcióival és lehetoségei-vel. Most nézzük meg azt, hogy hogyan alakítható ezek segítségével munkakörnyezetünk. Ha bejelentkezési shell-ünk a Bourne shell, akkor bejelentkezésünkkor két speciális konfigu-rációs állomány tartalmát olvassa be és hajtja végre a rendszer. E két fájl a /etc/profile és a $HOME/.profile, tehát a saját kiindulási katalógusunkban lévo (rejtett) fájl. A /etc/profile fájl rendszerszintu konfigurációs parancsokat tartalmaz, ezt a fájlt a felhasználók nem is módosít-hatják. A személyreszóló beállításokat mindenki a saját .profile fájljában eszközölheti. Az alábbi példában egy tipikus .profile fájlt mutatunk be. $ cat .profile # @(#) $Revision: 66.1 $ # Default user .profile file (/bin/sh initialization). # A default terminalt 'hp'-re allitja: eval ` tset -s -Q -m ':?hp' ` # A torlo karaktert backspace-re,

Page 91: unix kézkönyv

4. fejezet A parancsértelmezõ (Bourne shell)

93

# a sortorlot CTRL-U karakterre allitja # az interrupt karakter a CTRL-C karakter lesz, # a fajlvege a CTRL-D: stty erase "^H" kill "^U" intr "^C" eof "^D" # egyeb terminalparametereket allit be: stty hupcl ixon ixoff tabs # beallitja a keresesi utvonalat: PATH=$PATH:. # Beallitja a megszakitaskezelest: trap "echo 'logout'" 0 # valtozok beallitasa: EDITOR=vi; export EDITOR PAGER=pg; export PAGER PS1="$ "; export PS1 $

Page 92: unix kézkönyv

94

5. FEJEZET

REGULÁRIS KIFEJEZÉSEK

A UNIX szépszámú adatmanipulációs eszközt nyújt a felhasználónak az editorokon kívül is. Az eszközök közül nagyon sok használ mintaillesztést, s a megadott mintára illeszkedo adato-kon további feldolgozást hajt végre. Vannak olyan parancsok, ahol a felhasználó adja meg a keresendo mintát, ilyen a grep parancs, másokban rejtve dolgozik a mintakereso algoritmus. Ugyanezeket a mintaillesztési szabályokat használják a UNIX különbözo editorai is, így a ké-sobbiekben ismertetendo ed, vi vagy sed is, ez indokolja, hogy külön fejezetben foglalkozunk a reguláris kifejezésekkel. Reguláris kifejezések használatakor egy alkalmasint igen komplex mintát adunk meg (ez a reguláris kifejezés), s azt vizsgáljuk, hogy a feldolgozandó adatok (az esetek túlnyomó részében szöveges fájlok, tehát karakterláncok) melyik része illeszkedik a megadott mintára. A reguláris kifejezések karakterekbol állnak, ezek közül néhány speciális jelentést hordoz, ezeket metakaraktereknek hívjuk, hasonlóan a shell-ben a fájlnév behelyet-tesítéskor használt speciális karakterekhez. Vigyázzunk azonban, a hasonlóság csak viszony-lagos, s a két módszer a jelölésmódban is eltér egymástól.

Nézzük a reguláris kifejezéseket meghatározó szabályokat. — Egy egyedülálló karakter, amely nem újsor karakter, és nem a . * [ \ ] ^ $ karakterek

egyike, az önmagára illeszkedik. Ez magyarul azt jelenti, hogy ha például a keresendo minta — reguláris kifejezése — egy „a” betut tartalmaz, akkor ez a vizsgált szövegben csakis egy darab „a” beture fog illeszkedni. Hasonlóképpen, az alma reguláris kifeje-zés csupa „rendes” karakterbol áll, amelyek mindegyike önmagára illeszkedik csupán, s így a fenti minta a vizsgált szövegben bárhol eloforduló alma karakterláncra fog illesz-kedni.

Page 93: unix kézkönyv

5. fejezet Reguláris kifejezések

95

— A \c páros, ahol c egy látható karakter, a c karakterre illeszkedik a karakter literális ér-telmében. Tehát a \* illeszkedik a *-ra, a \\ pedig a \-re.

— A . (pont) karakter egy olyan reguláris kifejezés, amely bármelyik (nem újsor) karak-terre illeszkedik. Így például az ab. minta illeszkedik az aba, abc, ... abz, ab0, stb ka-raktersorozatokra.

— Ha e egy reguláris kifejezés, akkor e* egy olyan reguláris kifejezés, amely e reguláris kifejezés 0 vagy többszöri elofordulását jelzi. Így az a* reguláris kifejezés illeszkedni fog az üres stringre is (hiszen abban nullaszor szerepel az a karakter), valamint az a, aa, aaa, aaaa, ... stb karakterláncokra.

— (A reguláris kifejezések teljes implementációiban szerepel a + jelölés is, ami a mege-lozo reguláris kifejezés egy vagy többszöri elofordulására illeszkedik. Belátható, hogy ez a jelölés helyettesítheto, hiszen például az a+ ekvivalens az aa* megadással. A leg-több, reguláris kifejezéseket használó UNIX parancsban a szukebb implementáció sze-repel.)

— [..] a szögletes zárójelbe tett karaktersorozat illeszkedik az abban a pozicióban lévo bármely, a zárójelben felsorolt karakterre. A karakterek felsorolására érvényes szabá-lyok az alábbiak:

— Kódjukat tekintve egymás után következo karaktereket rövidíteni lehet a kötojel hasz-nálatával. Például 0-9a-z jelenti az összes számjegyet és az angol ábécé összes kisbetu-jét.

— A nyitó zárójelet követo ^ jel, a felsorolt karakterek tagadása. Azaz [^0-9] jelenti bár-mely, nem szám karaktert.

— A ] zárójel csak a felsorolás elso tagja lehet. — A - karaktert a \- karakterpáros jelöli. (Ha '[' után vagy ']' elott szerepel, a megelozo '\'

elmaradhat. — Két egymás után írt reguláris kifejezés szintén reguláris kifejezés. Például a [^0-9][0-9]

kifejezés egy nem szám karaktert követo számkarakterre illeszkedik. — Két egymástól | jellel vagy újsorral elválasztott reguláris kifejezés illeszkedik akár az

egyik akár a másik kifejezésre. Így a [a-z]|\. kifejezés az adott pozícióban csak kisbetut vagy egy pontot fogad el.

— A \(..\) tett reguláris kifejezés illeszkedik a zárójelbe tett kifejezésre, és egyben megjelöli azt.

Page 94: unix kézkönyv

UNIX felhasználói ismeretek

96

— A ^ jel a sor elejére a $ jel a sor végére illeszti a mintát. Például a ^ $ kifejezés az üres sorra illeszkedik, a ^[^0-9]*$ kifejezés pedig a számot nem tartalmazó sorra.

— A \n kifejezés (ahol n egy szám) a zárójelezéssel kijelölt mintára hivatkozik, mégpedig a kijelölés sorrendjében. Így a ^\(.\)\(.\).*\2\1$ minta olyan sorokra illeszkedik, ahol a sor elso két karaktere tükörszimmetrikus az utolsó két karakterre (pl. 'axc23xa').

— Néhány szabály a minta elofordulásának számosságára utal. Az egykarakteres reguláris kifejezést követo \{m,n\} sorozat, ahol m és n 256-nál kisebb, nem negatív egész, azt mondja, hogy a minta legalább m-szer és legfeljebb n-szer fordul elo egymás után. Ha csak az n szám van a zárójelpároson belül, annak jelentése, pontosan n-szer eloforduló minta, ha m, van a zárójelpáron belül, annak jelentése legalább m elofordulás.

Az editorokról szóló további fejezetekben, és a feladatok között számos jó példát mutatunk a reguláris kifejezések szélesköru alkalmazására. Tapasztalt UNIX felhasználók sok munkát ta-karítanak meg a reguláris kifejezések használatával.

Page 95: unix kézkönyv

97

6. FEJEZET

AZ ED EDITOR

A UNIX szövegszerkesztoirol általában Az egyik leggyakoribb vád, ami a UNIX rendszereket illeti, hogy a PC-ken elterjedt képernyo-orientált editorokhoz képest kényelmetlen, fáradságosan használható editoraik van-nak. Ez részben igaz, hiszen a UNIX-os editorok általában nem használják sem a kurzormoz-gató, sem a funkcióbillentyuket, ráadásul elkülönül a parancsmód és a beviteli mód, ami a PC-khez szokott felhasználóknak bizony nehezen megszokható. Ezt a hátrányt ellensúlyozza, mi legalábbis így gondoljuk, a szellemes és programíráshoz jól használható parancsok soka-sága. A következokben tárgyalt editorok egymásra épülnek, és mindannyian azonos alapelvek szerint muködnek. Ezért célszeru többet is megismerni belolük, és mindig az adott feladathoz legjobban illeszkedot használni.

Az ed Az ed szövegszerkeszto, vagy ed szuro a UNIX legrégebbi szövegszerkesztoje. Érezhetoen olyan eszköz, ami a ma megszokottnál korszerutlenebb beviteli eszközre, a teletypera épül. Bár sokan erre azt mondják, hogy akkor felesleges vele foglalkoznunk, mi mégis azt gondol-juk, hogy érdemes. Ennek oka nem csak az, hogy sokszor nagyon ügyes fogások elvégzésére alkalmas, hogy több más, a UNIX alatt létezo editor is erre épül, valamint, ha bármi okból nem tudunk képernyo-orientált szövegszerkesztot használni, az ed-et akkor is el tudjuk indíta-ni, például ha a login fájlunkban a TERM változót helyes értékre kell állítani. Végül megem-lítjük, hogy az ed szuroként is alkalmazható, mint azt a példák némelyikében majd látni is fogjuk.

Az ed tárgyalásánál a reguláris kifejezések tulajdonságait ismerteknek tekintjük.

Muködési alapelvek Akárcsak a szintén tárgyalt vi editor, az ed is több üzemállapottal rendelkezik, a beírási- és a parancsmóddal. Belépéskor a felhasználó parancs üzemmódban találja magát.

Page 96: unix kézkönyv

UNIX felhasználói ismeretek

98

Parancsmódban az egyes beírt, és RETURN karakterrel lezárt sorokat megpróbálja ed pa-rancsként értelmezni, és ha ez sikerült, végrehajtja.

Parancsmódból az a,i,c utasítások valamelyikével kerülünk beírás módba. Beírás üzemmód-ban minden beírt karakter a szövegbe kerül, beleértve az újsor karaktert is. (A parancssorok gépelésekor használatos törlo- és egyéb speciális karakterek itt is a szokásos módon muködnek.) A beviteli mód mindaddig tart, amíg egy új sor elején egy önmagában álló pont (.) karakter nem szerepel. Az ezután leütött RETURN karakterrel térünk vissza parancsmód-ba.

A szövegszerkesztot az

ed

vagy az

ed filename

parancs aktivizálja. Az ed a szerkesztendo szöveget egy bufferban tartja, a változtatásokat ezen bufferen hajtja végre, és csak parancs hatására menti el fájlba. Az ed editor takarékosan bánik a megjelenítendo szöveggel, (azaz teletype-ban gondolkodva: a papírral...) és csak ak-kor ír ki szövegdarabokat, ha egy utasítással erre külön felszólítjuk. Behívásakor a parancs sor után az editor kijelzi az állomány hosszát karakterekben, majd a következo üres sorban, parancs módban várakozik. Ekkor az a (append) parancsot beírva beléphetünk a beírás üzem-módba.

Az ed parancsainak alakja Nagy általánosságban az ed parancsokat az alábbi alakban lehet leírni:

címkijelölés parancs argumentum

A parancs általában egy betu, vagy egy betu és egy írásjel (ez a betu általában, mint a UNIX-ban már annyiszor megszoktuk, a parancs angol elnevezésének rövidítése).

A parancsok egy lehetséges csoportosítási módja az, hogy átvisz-e beírás üzemmódba vagy sem. A beírás üzemmódba átvivo parancsok argumentuma a beírandó szöveg, ezt a parancsok ismertetésénél text néven jelöljük. A többi parancs argumentumait esetileg tárgyaljuk.

A címkijelölés meghatározása a legszínesebb a három fogalom között. A címkijelölés mindig egy vagy több sort határoz meg, amelyre vagy amelyekre a parancs végrehajtása vonatkozik. Egy sorra hivatkozhatunk sorszámmal, egy sorokban megadott szövegtartományra két vesszo-vel elválasztott sorszámmal. Ha egyáltalán nem adunk meg sorszámot, akkor a parancs a min-denkori aktuális soron hajtódik végre. Így a

3,13p

parancs hatására az ed a buffer tartalmát a harmadik sortól a tizenharmadik sorig kinyomtatja a képernyore. A

Page 97: unix kézkönyv

6. fejezet Az ed editor

99

12d

parancssor hatására a buffer tizenkettedik sora törlodik, míg a

d

parancs hatására az aktuális sor. (Az új aktuális sor ilyen esetekben általában az utolsó törölt sor utáni lesz.)

A buffer elso sora mindig az 1-es sorszámot viseli. A sorszám meghatározásában a következo jelöléseket alkalmazhatjuk: a . (pont) karakter az aktuális sort jelöli, ahol a mutató áll. Tehát a

.,25d

parancs azt jelenti, hogy az aktuális sortól a huszonötödik sorig bezárólag törölni kell. A

.=

hatására az ed kiírja az épp aktuális sor sorszámát. A '$' jel jelöli a buffer utolsó sorát. Így a

.,$d

parancs hatására az aktuálistól az utolsó sorig terjedo szövegrész törlodik a bufferból.

Alkalmazhatunk relatív címzést is, a '+', '-' jelek segítségével. Például a

.+2,$-3d

parancs az aktuálist követo második sortól az utolsó sor elotti harmadik sorig töröl a bufferban. Azokat a sorokat, amelyeken parancsot akarunk végrehajtani, nem csak direkt cím-zéssel, hanem szövegminta alapján is kijelölhetjük. A szövegmintának szintaktikusan eleget kell tenni a reguláris kifejezések szabályainak. Formális követelmény, hogy a mintát '/' jelek közé kell zárni. Tehát a

/begin/a

szoveg

.

kérés az olvasás irányban soronkövetkezo elso olyan sort keresi meg, amelyben a begin ka-raktersorozat elofordul, és azt követoen szúrja be a "szoveg" sort a buffer tartalmába, majd a sor elején álló pont karakter hatására újra parancsmódba kerül.

A minta szerinti keresés, vagy sorkiválasztás teljesen azonos értéku a sorszám szerinti sorki-jelöléssel. Így a

/begin/,/end/d

parancs a legközelebbi begin szócskát tartalmazó sortól a legközelebbi end szót tartalmazó sorig törli a szöveget. Figyelem, ebben az esetben a két mintát egyszerre kezdi keresni, és így ha azok azonos sorban fordulnak elo, akkor csak azt az egy sort találja meg. Amennyiben azt

Page 98: unix kézkönyv

UNIX felhasználói ismeretek

100

kívánjuk, hogy az end mintát csak az után a sor után kezdje keresni, amelyikben a begin mintát megtalálta, akkor a két mintát pontosvesszovel választjuk el:

/begin/;/end/w file

Tehát a fenti parancs hatására, a kurrens pozícióhoz legközelebb eso begin end páros közti szövegdarab a file nevu állományba íródik.

Használhatjuk a mintával megkeresett sort relativ címzésre is:

/begin/-1 s/alma/korte/

Így a fenti parancs a legközelebbi begin elotti sorban az alma mintát korte mintára cseréli.

Ha a minta keresése közben a buffer végére ért, az editor a szöveg elején folytatja a keresést. A keresés irányát megfordíthatjuk, ha a '/' jel helyet '?' jelekbol álló párosba tesszük a mintát. Ha a mintát nem találja, illetve más problémája támad a keresés közben, egy kérdojel kiírásával vála-szol az editor.

Ha a munka befejezésével a buffert el kívánjuk menteni, a

w

vagy a

w file

paranccsal tehetjük meg, végül a q vagy a Q paranccsal lezárhatjuk az editor muködését.

Az ed szövegszerkeszto parancsai e file (edit) Az argumentumában megnevezett állomány betöltése a bufferba. r file (read) Az argumentumában megnevezett állomány betöltése a buffer végé-

re. E file (edit) Editálás ellenorzés nélkül. w file (write) A buffer sorainak elmentése. W file (write) A buffer hozzáírása a megadott állományhoz. q (quit) Kilépés, de csak akkor, ha a buffer aktuális tartalmát elmentette. El-

lenkezo esetben figyelmeztetést kapunk, egy kérdojelet. Q (quit) Kilépés ellenorzés nélkül. nnn szövegminta 'marker Adott sor kiírása a képernyore, egyben kurrens sorrá tétele. nnn egy

abszolút vagy relatív sorszám lehet, szövegminta egy reguláris kifejezés,

Page 99: unix kézkönyv

6. fejezet Az ed editor

101

marker pedig egy kmarker paranccsal elozoleg beállított szövegjelzo (marker).

+ A kurzor eloreléptetése egy sorral a bufferban. - A kurzor hátraléptetése egy sorral a bufferban. = Sorszám kiíratás p (print) Kiíratás a képernyore n (number) Kiíratás a képernyore a sorok sorszámaival együtt. f (file) Az editálás alatt lévo állomány nevének kiíratása. a text (append) Hozzáírás a kurrens sor után. Új állomány szerkesztésénél az a pa-

rancs kiadásával kell kezdeni a munkát. i text (insert) Beszúrás a kurrens sor elé. d (delete) Sortörlés. j (join) A megnevezett sorok összekapcsolása a felsorolásuk sorrendjében.

Nem szükségszeru, hogy egymás utáni sorokat kapcsoljunk össze, de min-dig csak az alacsonyabb sorszámú sorhoz lehet a magasabb sorszámút kapcsolni. Az új sor az alacsonyabb sorszámú sorban lesz.

s /m1/m2/ (substitute) A parancsban megadott két minta felcserélése. u (undo) Az utolsó változtatás elotti állapot visszaállítása. c text (change) Beszúrás módba kerül és a jelzett sorokat kicseréli arra a

szövegre, amit a parancs utáni sorokba beírunk. Ha több új sor van, mint amit változtatásra kijelöltünk, akkor a többlet beszúródik a szövegbe. Ha a kijelöltnél kevesebb új sort írunk, a maradék sorok érintetlenek maradnak. A cserére leírt sorok után új sorba írt soreleji pont visszavisz parancs módba.

gedcmd (global) Az edcmd parancs végrehajtása a buffer minden illeszkedo sorá-

ban.

A felsorolt parancsokkal már szinte mindent meg tudunk tenni, amit az ed szerkesztovel le-het, a további parancsokat inkább csak a gyakorlott felhasználók használják. l (list) Kiíratás a képernyore a vezérlokarakterekkel. mpos (move) A kijelölt sor(ok)nak a pos argumentummal megadott sor után

mozgatása (pos az ed szabályainak megfeleloen mind sorszám, mind minta, mind marker lehet).

Page 100: unix kézkönyv

UNIX felhasználói ismeretek

102

tpos A kijelölt sor(ok)nak a pos argumentummal megadott sor után másolása (pos az ed szabályainak megfeleloen mind sorszám, mind minta, mind marker lehet).

kc Marker elhelyezése a kijelölt sorba. A marker neve az argumentumban írt

betu lesz, amire a késobbiekben a 'c, azaz a betut egy aposztroffal mege-lozve lehet hivatkozni.

!cmd Argumentuma egy cmd shell parancs, ami végrehajtódik, majd vissza-

térünk az ed parancsállapotába.

A következo két parancsot inkább parancsmódosítóknak lehetne nevezni. Helyük a parancs-sor végén, a parancsargumentum után van. v a parancs végrehajtása minden olyan sorban, amit a sorkiválasztó minta

nem jelöl ki. g a parancs végrehajtása a soron belül minden olyan helyen, ahol lehet.

Néhány példa az ed szövegszerkeszto használatára

Elso példánkban azt mutatjuk be, hogy hogyan lehet markerrel jelzett sorokon operálni. Legyen az a feladatunk, hogy egy fájlban az elso lepke szót tartalmazó sor elé beszúrjuk a szövegben található összes pillango szót tartalmazó sorokat. A k parancs segítségével a pél-dában a h betuvel jelöljük meg a lepke mintát tartalmazó sort, majd az egész bufferen végrehajtatjuk az áthelyezést. (A markeres megadásnak az az elonye, hogy ha maga a lepke szó megváltozik a referencia sorunkban, a marker orzi pozícióját, és nyugodtan hivatkozhatunk rá parancsainkkal; hasonlóképpen, ha a markerral jelölt sor pozíciója változik a fájlban (akár mert eléje szúrunk be valamit, akár mert ot magát mozgatjuk), a marker „foggal-körömmel” ragaszkodni fog ahhoz a sorhoz, amihez eloször hozzárendeltük.) /lepke/kh g/pillango/m'h-1 Következo példánkban Romhányi József legendás tevéjének hátán tevegelünk be az ed szépségeinek birodalmába... A teve nevu állományunkban az ismert vers egy részlete szerepel, csak kissé hibásan: $ cat teve Monotn uget a suppedo homokon a sivatag lova oda $

A javítás során megnézzük, hogy hány soros a versrészlet, majd eloször a hiányzó utolsó elotti sort ('a tetova teve') pótoljuk az a parancs segítségével. Mivel az elso és utolsó sor is hibás, azokat a c paranccsal cseréljük helyesre. Végül az elsotol az utolsó sorig kiíratjuk a muvet a képernyore, majd el is mentjük a fájlt.

Page 101: unix kézkönyv

6. fejezet Az ed editor

103

$ ed teve 39 $= 4 $-1a a tetova teve . $c tova . 1 Monotn 1c Monoton . 1,$p Monoton uget a suppedo homokon a sivatag lova a tetova teve tova w 65 q $

A számítástechnikához közelebb álló a következo példa. A cskel.c állomány az alábbi: $ cat cskel } if != than else while != { $

A hibákat újra az ed segítségével javítjuk. A javító parancsokat egy javit nevu állományba tesszük, hátha még máskor is hasznát vesszük. A javít a munkáját kommentekkel kíséri. $ cat javit !echo Kezdodik a javitas 1t$ $-1m1 1d !echo Mar megcsereltem a sorokat. Betucsere jon. /^if/ s/!/=/ /than/ s/a/e/ 1 g/^[^iwf]/ s/^\( \)/ \1/g 1 g/^[ ]*[^{}]$/ s/\([ ]*\)// 1 g/^ /s/\([^ ]\)/ \1/g

Page 102: unix kézkönyv

UNIX felhasználói ismeretek

104

1,$p w cskelj.c q $ $ ed cskel.c <javit 29 Kezdodik a javitas Mar megcsereltem a sorokat. Betucsere jon. { if == t h e n e l s e while != } 49 $

A javítófájlban eloször megcseréltük az elso és utolsó sort, majd az if-fel kezdodo és a than-t tartalmazó sorban hajtottunk végre karaktercserét. Ezután a buffer elejére mentünk, és min-den nem 'i', 'w' vagy 'f' betuvel kezdodo sor elejére két szóközt tettünk: ez az elso g paranccsal kezdodo sor. Utána kiirtottuk a kapcsos zárójelek elol a szóközöket, majd a következo lépés-ben minden szóközzel kezdodo sorban, minden nem szóköz karakter után egy szóközt szúr-tunk be. Vegyük észre a különbséget. A parancs sor elején lévo g (global) parancs a buffer összes sorára kiterjeszti a sorfelismero mintával való sorkeresést, míg a parancssor végén lé-vo parancsmódosító g az éppen vizsgált sor egészére terjeszti ki a parancs végrehajtását. Vé-gül kiírattuk majd eltettük egy új néven az állományt.

Page 103: unix kézkönyv

105

7. FEJEZET

A SED EDITOR

A sed editor az ed igen közeli rokona, igazság szerint annak egy szukített parancskészletét ismeri. Ennek ellenére külön foglalkozunk vele, mert más célokra használható mint rokona, s feldolgozási elve is eltér az alapvetoen interaktív ed editortól. (A név egyébként a stream editor kifejezésbol ered, magyarra leginkább az áradatszerkeszto, vagy adatfolyamszerkeszto kifejezéssel lehetne fordítani.) Míg az ed és a vi a mindennapos fájlszerkesztési munka eszköze, a sed inkább nagyméretu fájlokban rutinszeruen végrehajtandó, komplex behelyettesítésekre alkalmas (képzeljük el például, hogy egy Unix rendszer teljes manuálsorozatában minden manuáloldalon ki kell cserélni a verziószámokat, valamint a megfelelo hivatkozásokat a szövegben; vagy éppen abba a szerencsés helyzetbe kerültünk, hogy kézzel kell megcsinálnunk egy HTML formátumú "webes" anyag átkonvertálását úgy, hogy a HTML formázó karakterek eltüntetésével tiszta szövegállományt akarunk eloállítani; mindezek tipikusan olyan alkalmazások, melyek a sed után kiáltanak).

A sed hívási formája a következo: sed [opciók ...] script [fájl ...]

A sed mindig a standard kimenetre dolgozik, azaz a bemenetként szolgáló fájlt (ha egyáltalán fájlt olvasott, s nem a standard bemenetet) soha nem módosítja.

A script tartalmazza a sed által végrehajtandó parancsokat. Mint már említettük, a sed parancskészlete nagyon hasonlít az ed editoréra, de azért az eltéro muködésébol fakadólag vannak különbségek, ezekre rövidesen kitérünk.

A sed mindössze az alábbi három opciót ismeri:

-n a feldolgozott sorok automatikus kiírását letiltja, csak explicit sed parancs hatására írja ki a kimenetre a módosított sorokat

-f scriptfájl scriptfájl tartalmazza a sed által végrehajtandó parancsokat

-e script akkor használjuk, ha a sed parancssorában több végrehajtandó scriptet adunk meg. Egyetlen script esetén elhagyható.

Néhány példa: a $ sed 's/Unix/UNIX/g' chapter1.txt >chapter1.txt:1

parancs hatására a chapter1.txt fájlban minden Unix szót UNIX-ra cserél, s az így módosított állományt elmenti chapter1.txt:1 néven (az eredeti változatlanul hagyásával). Az ls -lt | sed '1d \ 3q'

Page 104: unix kézkönyv

UNIX felhasználói ismeretek

106

hatására az idorendbe állított ls lista elso sorát törli a sed (az ugyanis nem fájl bejegyzéseket tartalmaz), majd a legfrissebb három fájl nevét kiírja a képernyore. Célszeru mindig szimpla idézojelek közé tenni a végrehajtandó scriptet, ha a parancssorból gépeljük be. Ha a scriptet fájlba írjuk, az idézojelek természetesen elmaradhatnak: $ ls -lt | sed -f frissfájlok

frissfájlok tartalma pedig ezek után a következo: 1d 3q

A sed muködési elve A fenti gyors szintaktikai összefoglaló után lássuk, hogyan is muködik a sed. A legfontosabb, hogy a sed (a késobb ismertetendo kivételektol eltekintve) mindig egyszerre egy sorral dolgozik! A sed a feldolgozandó fájl(ok) sorait egyenként olvassa be, s a beolvasott sor az ún. pattern space-be (mintatérbe) kerül. A sed ezután a mintatér tartalmán hajtja végre egymás után a scriptben szereplo parancsokat. A dolt betus megadás nem volt véletlen: a sed muködésébol fakadóan a mintatér(be beolvasott) sor tartalmát a végrehajtott parancsok módosítják, így a legtöbb sed parancs már nem az eredeti beolvasott soron, hanem az elozo parancs által már módosított soron hajtódik végre. Ha a scriptben szereplo összes parancs feldolgozta a mintatérben lévo sort, a mintatér tartalma kikerül a standard outputra (a -n opcióval ezt a default kiírást tilthatjuk le). A mintatér kiürítése után a sed beolvassa a következo sort a bemenetrol a mintatérbe, s azon megint csak sorra végrehajtódnak a scriptben szereplo parancsok. A sed muködését tehát az alábbi egymásba ágyazott ciklussal szemléltethetnénk: for sor in ( fájl ); do sor a mintatérbe kerül for parancs in ( script ); do parancs végrehajtódik a mintatér tartalmán done mintatér tartalma a standard kimenetre kerül done

Nagyon figyeljünk arra, mert a legtöbb félreértést ez szokta okozni, hogy a "belso ciklusban" mindig a parancsok végrehajtása szerepel, azaz a sed a sorokat egyenként olvassa be, és a mintatérben éppen bennlevo soron hajtja végre egymás után a scriptben szereplo összes parancsot, nem pedig fordítva, a teljes fájlon egymás után a script egyes parancsait! A következo példa talán megvilágítja a problémát:

Ha egy fájlunkat feldolgozva az alma szót körtére, a körtét pedig barackra szeretnénk változtatni, akkor "reflexszeruen" valami hasonlót írnánk a scriptbe: s/alma/korte/ s/korte/barack/

Page 105: unix kézkönyv

7. fejezet A sed editor

107

Futtatás után "keseru kudarc lesz osztályrészünk": miután egymás után mindkét parancs végrehajtódik az éppen beolvasott soron, ha abban szerepelt az alma szó, akkor ezt várakozásunknak megfeleloen átírja körtére, ez a minta viszont a következo behelyettesíto parancsnak fog megtetszeni, s az a mintatérben nyomban továbbalakítja a körtét barackká, általunk nem kívánt uniformizálást hajtva végre gyümölcsállományunkon... A helyes megoldás a sed belso lelkivilágát figyelembe véve a két parancs megfordítása, azaz a s/korte/barack/ s/alma/korte/

script használata.

Címzés a sed-ben A következokben nézzük meg, hogy mennyiben tér el a sed által használt parancsformátum és címzés az ed-nél megismertektol. Az általános parancsmegadás formája a sed esetében is ugyanaz, mint az ed-nél volt: [cím1 [, cím2] parancs [opció(k)]

azaz nulla, egy vagy két cím (ami kijelöli a parancs muködési tartományát), maga a sed parancs, s végül az esetleges parancsmódosító flag-ek.1 A címmegadás is hasonló az ed-hez: használhatunk abszolút vagy relatív sorszámokat, illetve reguláris kifejezéseket. Mindjárt beleütközünk viszont egy alapveto korlátba: ellentétben az interaktív muködésu ed editorral, itt a fájlban visszafelé nem hivatkozhatunk, hiszen a sed az egyszer már beolvasott és feldolgozott sorra nem tud visszatérni. Ennek értelmében az 50,$d

megadás (töröljük a fájl sorait az ötvenediktol a fájl végéig) teljesen szabályos, de a $,.-3d

már nem, s erre a sed figyelmeztet is, hiszen a relatív visszalépéssel nem tud mit kezdeni.

Egy vagy két cím esetén az ed és a sed program azonosan muködik, azaz a megadott soron, vagy sortartományban operál. Például a /brehm_eleje/,/brehm_vege/ s/kutya/cica/

1 A sed egy nem dokumentált tulajdonsága, hogy pontosvesszõvel elválasztva is megadhatjuk a scriptben szereplõ parancsokat, nem kell feltétlenül külön sorba írni õket (pl. sed '1,$s/alma/korte/; /$^/d' ). Lehetõség van arra is, hogy kapcsos zárójelek között csoportosítva egy címtartományhoz több parancsot is megadjunk, s ekkor a zárójelen belüli paran- csoknak is lehetnek tetszõleges címkijelölõ paramétereik. A sed '/end_of_paragraph/ { n

/^$/d }' parancs hatására az end_of_paragraph mintát tartalmazó sort a sed kiírja a kimenetre, beolvassa a következõ sort, s ha az üres volt, kitörli.

Page 106: unix kézkönyv

UNIX felhasználói ismeretek

108

parancs esetén mindkét program az elso, brehm_eleje szót tartalmazó sortól az elso brehm_vege sorig próbálja meg a kutya szót cica-ra cserélni. Cím nélküli sor esetében viszont eltéro viselkedésük: az ed esetében a s/kutya/cica/

parancs az aktuális sorban cserélte kutyát cicára (ha volt ilyen minta a sorban); sed esetében ugyanez a parancs azt jelenti, hogy a bemenet minden egyes során kísérelje meg a sed a behelyettesítést. Szemléletes ökölszabályként azt mondhatjuk, az ed esetében az alapértelmezés az aktuális sor, s minden címmegadás ehhez képes bovíti a parancs hatókörét, a sed esetében épp ellenkezoleg, alapértelmezés szerint minden soron végrehajtódik egy adott parancs, s a címtartomány megadása ezt csak szukítheti.

Még egy utolsó megjegyzés a címzéssel kapcsolatban: ha egy címmegadás után a '!' (felkiáltójel) karakter szerepel, az megfordítja a címzés értelmet, azaz az utána következo parancs(ok) az adott címzéssel ki nem jelölt bemeneten hajtódnak végre. Ha például a /ez_kell/!d

parancsot adjuk ki, akkor minden, az ez_kell szekvenciát nem tartalmazó sor törlodik a bemenetrol.

A sed fontosabb parancsai A fentiek után, ha csak röviden is, tekintsük át a sed leggyakrabban használt parancsait. Mivel a legtöbb parancs akár nulla, akár egy vagy két címmel is megadható, a címmegadást a következoek szerint jelöljük: ha a parancs csak egy címet fogad el, a /sorcím/ jelölést alkalmazzuk, ha kettot, akkor a /címtartomány/ jelölést.

Behelyettesítés

[címtartomány] s / minta / új_minta / [jelzők]

A címtartomány által meghatározott tartományban lévo sorokban behelyettesíti minta helyére új_mintát. Mind címtartomány, mind minta lehet reguláris kifejezés, az összes ott megismert metakarakter használható megadásukkor. Ha címtartomány reguláris kifejezés, és azonos minta-val, azaz minta megadása nem kötelezo (pl. a /kutya/s//macska/g parancs minden, a kutya szót tartalmazó soron fog végrehajtódni, s ott minden kutyát lecserél macskára).

Módosító flagek

Behelyettesítéskor az alábbi jelentésmódosító flagek használhatóak:

Page 107: unix kézkönyv

7. fejezet A sed editor

109

n 1 és 512 közti szám, mely azt jelzi, hogy a behelyettesítést minta n-edik elofordulásán kell csak végrehajtani

g a mintatérben minta összes elofordulását lecseréli, nem csak a legelsot, amit talál

p kilistázza a mintatér tartalmát

w file a mintatér tartalmát a file állományba írja

Metakarakterek a keresendo minta megadásakor

A keresendo mintát a reguláris kifejezéseknél megismert módon adhatjuk meg, az ott megismert metakarakterek használhatóak.

Metakarakterek a behelyettesítés megadásakor

Az alábbi metakarakterek a behelyettesítés jobb oldalán használhatóak.

& minta értékének felel meg. Például s/Egyesült Államok/Amerikai &/ hatására sed a teljes névre egészíti ki slendrián megfogalmazásunkat.

\n (n egyjegyu egész szám); a mintában, tehát a behelyettesítés baloldalán a reguláris kifejezésben szereplo n-edik, \( .. \) ka- rakterek közé zárt reguláris alkifejezésre hivatkozik. Például az s/\([A-Z][a-z][a-z]*\) \([A-Z]\.\) \([A-Z][a-z][a-z]*\)/\3 \1 \2/ parancs hatására a köz-napi formában írt angolszász neveket alakítja át "hivatali használatra", például John C. Smith helyett Smith, John C. formára. (Lefordítva a fenti, valóban meglehetoen ronda kifejezés valami olyasmit csinál, hogy "elso reguláris alkifejezés legyen egy nagybetuvel kezdodo, egy vagy több kisbetut tartalmazó karaktersorozat, ezt szóköz követi, a második alkifejezés egy nagybetu, melyet egy pont karakter követ; szóköz, majd a harmadik alkifejezés ismét csak nagybetu, egy vagy több kisbetuvel követve; ha a mintatérben talált a sed erre illeszkedo mintát, a harmadik, az elso és a második alkifejezésre illeszkedo részét írja a kimenetre".)

\ több funkciót is ellát, egyrészt a másik két metakarakter speciális jelentését nyomja el, másrészt többsoros behelyettesítés megadásánál használatos. Többsoros behelyettesítésre lehet példa az alábbi, ahol ha a

sed 's/\.ti \([0-9][0-9]*\) \(.*\)/\1. fejezet\ \2/'

parancs a .ti 3 Az cserebogarak halhatatlansagarul

veretes szövegformázó makróutasítást a 3. fejezet Az cserebogarak halhatatlansagarul

kétsoros formára hozza.

Page 108: unix kézkönyv

UNIX felhasználói ismeretek

110

Törlés

[címtartomány]d

A d parancs a kijelölt sort vagy sorokat törli (részleges törlésre a substitute parancsot használhatjuk). Egy dolgot kell ezzel kapcsolatban megemlítenünk: ha egy sort kitörlünk a mintatérbol, a feldolgozás értelemszeruen megszakad, új sor kerül be a mintatérbe, s a sed scriptben szereplo parancsok annak feldolgozását kezdik meg.

Hozzáfuzés, beszúrás, változtatás

[sorcím]a\

szöveg

[sorcím]i\

szöveg

[címtartomány]c\

szöveg

Az a (append) parancs a mintatérben lévo sor végére, az i (insert) parancs a mintatérben lévo sor elejére, a c (change) parancs pedig a mintasor helyett illeszti be szöveget. Vigyázzunk arra, hogy mindhárom parancs többsoros, a parancs betuje után mindenképpen kell a backslash karakterrel védett soremelés, s kell a szöveg sorainak végén is, ha a beillesztendo szöveg többsoros. Szokatlan lehet az is, hogy a beillesztett szöveg kiíródik ugyan a kimenetre, de nem képezi részét a mintatérnek, s így a soronkövetkezo script parancsok nem veszik figyelembe a sor feldolgozásánál. Mivel a c parancs törölte az eredeti mintateret, a szóban forgó sor feldolgozása éppúgy megszakad, mintha a d vagy q parancsot adtuk volna ki.

Transzformáció

[címtartomány] y / str1 / str2 /

Az y (olvasd: transform... :-) parancs a mintatérbe kerülo sorokon karakterkonverziót hajt végre, mégpedig úgy, hogy mindazon karaktereket, melyek str1-ben szerepelnek, a mintatérben str2 ugyanazon pozíción lévo karakterével helyettesíti. (Gyakorlatilag a tr nevu Unix parancs mintájára.) Az alábbi sed parancs például minden számjegyet az N betuvel helyettesít a kimeneten: sed 'y/0123456789/NNNNNNNNNN/'

Page 109: unix kézkönyv

7. fejezet A sed editor

111

Nyomtatás

[címtartomány]p

A p (print) parancs a mintatér tartalmát írja ki a mindenkori kimenetre. Miután a sed alapértelmezés szerint a mintatér minden sorát kiírja, a p parancsot a hibakeresés miatti kiíráson kívül a leginkább akkor használjuk, ha a sed parancsot a -n opcióval hívtuk meg, azaz alapértelmezésben letiltottuk a sorkiírást. (Ha például bizonyos részeket keresünk egy fájlban, s nem módosítani akarjuk, e megoldás a célravezetobb.) sed -n '/Linux/p'

A fenti parancs hatására a Linux szót tartalmazó sorok íródnak ki, a sed a többit eldobja.

Új sor beolvasása

[címtartomány]n

Az n (next) parancs hatására a mintatér pillanatnyi tartalmát sed kiírja a kimenetre, törli azt a mintatérbol, majd beolvassa a soron következo sort, s azon folytatja a script parancsainak végrehajtását. Az alábbi parancs a '.' karakterrel kezdodo sorok után beolvassa a következo sort (vigyázat, ekkor az eredetit már a kimenetre tette!), s ha az újonnan beolvasott sor üres volt, törli azt: sed '/^\./ { n /^$/d }'

Fájlok írása-olvasása

[sorcím]r file [címtartomány]w file

Az r (read) paranccsal a megadott cím után olvassa be a sed a mintatérbe file tartalmát; w (write) hatására a megadott címtartományon belüli rész kerül ki file-ba. Szintaktikai finomság: mindkét parancs pontosan egy szóközt követel meg a parancs és a fájlnév között; ha többet adunk meg, azt a fájlnév részének fogja tekinteni. Ha nem létezo fájlt akarunk olvasni, a sed nem panaszkodik; hasonlóképp, nem létezo fájl írásakor létrehozza azt, már létezo tartalmát pedig felülírja. (A scripten belüli többszöri írások hozzáfuznek a fájlhoz.)

Az a, i és c parancsokhoz hasonlóan az r parancsra is igaz, hogy azonnal sed kimenetére kerül, s a script további feldolgozásában, mintaillesztésében nem vesz részt, a mintatérben maradó eredeti sor viszont igen. Egy példa ennek illusztrálására:

Tegyük fel, hogy van egy template nevu mintafájlunk, az alábbi szöveggel: Kedves Ismeretlen, On cegunktol az alabbi ingyenes alomutazasok valamelyiket nyerte: <cimlista> Ezek igenybevetelehez mindossze az alabbiakat kell tennie...

Page 110: unix kézkönyv

UNIX felhasználói ismeretek

112

A behelyettesítendo adatok pedig a helyszin.txt nevu állományban találhatóak: Kanari szigetek repulogeppel Korfu szigete autobusszal Margit-sziget vízibusszal

Ha ezek után a sed-et a sed '^/<cimlista>/ { r helyszin.txt ; d }' template

paranccsal hívjuk meg, akkor helyszin.txt szövege beszúródik a mintatér végére; a következo d parancs viszont a mintatér eredeti tartalmát törli, s így amikor a sed végzett az adott sorral, <cimlista> helyett a felkínált helyek listája jelenik meg a kimeneten: Kedves Ismeretlen, On cegunktol az alabbi ingyenes alomutazasok valamelyiket nyerte: Kanari szigetek repulogeppel Korfu szigete autobusszal Margit-sziget vízibusszal Ezek igenybevetelehez mindossze az alabbiakat kell tennie...

Page 111: unix kézkönyv

7. fejezet A sed editor

113

Több sor kezelése

N

D

P

Alábbi parancsaink az eddig ráolvasásszeruen ismételgetett dogmát kezdik ki, miszerint a sed sororientált editor, s egyszerre mindig csak egy soron végez muveleteket. Az N, D és P parancsok funkcionalitásukban egysoros megfeleloikkel azonosak, de mindegyik több soron dolgozik.

N hatására sed még egy sort olvas a bemenetrol, s a mintatér végére fuzi, annak régi tartalmát is megorizve. A mintatérben lévo sorokat az újsor '\n' karakter választja el, s erre a mintakereséseknél hivatkozhatunk is. (Lásd a következo példát.)

D hatására a mintatérbol egy sor, azaz a mintatér elejétol az elso újsor karakterig terjedo rész törlodik. Ellentétben a d paranccsal, hatására nem olvas be új sort a mintatérbe, a feldolgozás viszont itt is újra a script elejétol folytatódik. Klasszikus példa a D parancs felhasználására, amikor sok üres sort tartalmazó bemenetrol szeretnénk kiszurni a felesleges sorokat: /^$/ { N /^\n$/D }

(A megoldás azon alapul, hogy üres sor beolvasása után a sed még egy sort beolvas, ha az is üres, az elsot kitörli, s a script végrehajtása elölrol indul; azaz mindez a beolvasás és törlés addig folytatódik, amíg vannak többszörös üres sorok, a script egyesével araszol végig a beolvasott sorokon. Ugyanez a d parancs felhasználásával páratlan számú üres sorokra nem muködik, hiszen a d parancs a teljes mintateret, azaz mindkét sort törölte volna, a harmadik üres sor beolvasása után viszont nem üres sor jönne, s a script ekkor már nem törölné a harmadik üres sort.

P hatására sed a mintatérbol az elso újsor karakterig terjedo részt írja a kimenetre. Önmagában nem gyakran használják, tipikus alkalmazása az elozo példában szereplo, többsoros mintákat vizsgáló alkalmazásokban lehet. Ha ugyanis több egymás utáni sorban kell mintát keresni és behelyettesítést végezni, a legcélszerubb megoldás egy olyan hurok felépítése, ahol megfelelo számú N paranccsal beolvassuk a mintatérbe a vizsgálandó sorokat, a megfelelo behelyettesítések után P paranccsal kiírjuk a mintatér módosított elso sorát, majd ugyanazt töröljük a D paranccsal a mintatérbol. A script megint elölrol kezdi a feldolgozást, egy sorral odébb csúsztatva a "vizsgálati ablakot" a bemeneten. Alanti programocskánk (hasznosságáról valószínuleg nem kell gyozködni a tisztelt olvasót :-) a netalán helytelenül írt Kisfeju Zordonbordon neveket cseréli ki az autentikus Kisfeju Nagyfeju Zordonbordonra, abban az esetben is, ha az a sorhatáron átnyúlva zordonbordonkodik:

Ha a tesztfájlunk az alábbi: Mikor tegnap erre jott Kisfeju

Page 112: unix kézkönyv

UNIX felhasználói ismeretek

114

Zordonbordon, morcosan nezett a Kisfeju Zordonbordon, hogy nevet mindig rosszul mondom

a script pedig ez: /Kisfeju/ { N s/Kisfeju\(.Zordonbordon\)/Kisfeju Nagyfeju\1/g P D }

az eredmény ez lesz: Mikor tegnap erre jott Kisfeju Nagyfeju Zordonbordon, morcosan nezett a Kisfeju Nagyfeju Zordonbordon, hogy nevet mindig rosszul mondom

A script a Kisfeju szót tartalmazó sorok esetén beolvassa a következo sort is, s a kétsoros mintatéren globális behelyettesítést hajt végre, azaz a keresett minta összes elofordulását javítja: A Zordonbordon szót és az azt megelozo (szóköz vagy újsor) karaktert reguláris alkifejezésként megjelöltük, s a behelyettesítéskor ugyanezt tesszük vissza. Miután fenti módon az összes nevet kicseréltük, a mintatér elso sorát (ami garantáltan javított), kiírjuk, majd töröljük a mintatérbol, újabb sort olvasunk be, s újra kezdodik a script végrehajtása.

Az ideiglenes tárolótér és parancsai

A mintatéren kívül, ami mindig az aktuális sort tartalmazza, a sed egy másik területet is fenntart, ez a hold space (jobb híján nevezzük tárolótérnek). Ha egyes muveletek során arra volna szükségünk, hogy a mintatért elmentsük valahova, míg eredeti tartalmán muveleteket hajtunk végre, a tárolótérben tudunk egy ideiglenes kópiát képezni. A tárolóteret öt, nem címezheto parancs kezeli: h, H (hold), g, G (get) és x (exchange). A hold parancsok hatására a tárolótér tartalma a mintatérbe kerül, a get parancsok hatására pedig a tárolótér tartalma kerül vissza a mintatérbe. Az exchange parancs hatására a tárolótér és a mintatér tartalma megcserélodik. A kis- és nagybetus parancsok között az a különbség, hogy h és g bemásoláskor felülírja a tároló-, illetve a mintatér tartalmát, H és G pedig újsor karakterrel elválasztva hozzáfuzi annak tartalmához (az újsor karaktert akkor is beteszi, ha a minta- vagy tárolótér éppen üres volt).

Elágazások, feltételes parancsvégrehajtás

Számos olyan sed parancsot láttunk már, melyek implicit módon megváltoztatják a scriptben a feldolgozás folyamatát; az alábbiakban olyan parancsokkal zárjuk ismerkedésünket a sed-del, melyek kimondottan a parancsvégrehajtás folyamatát szabályozzák.

Page 113: unix kézkönyv

7. fejezet A sed editor

115

Címkék

A címkék használata teszi lehetové, hogy általunk kijelölt tetszoleges helyre ugorhassunk egy sed scriptben. A címke egy maximum hét karakterbol álló sorozat, melynek kettosponttal megelozve, egymagában kell egy sorban szerepelnie, hogy a sed felismerje. (Rendkívül gyakori hiba, hogy a címke és a sor vége között néhány szóköz karaktert felejt az ember; ne tegyük, mert hét karakterig bezárólag ezeket is a címke részének tekinti a sed!) Ha egy parancsban címkére hivatkozunk, a script végrehajtása a címkét követo soron folytatódik. Például az alanti scriptrészlet hatására a loop3 címkére ugráskor a sed a mintatér tartalmát a tárolótér tartalmához fuzi, majd törli a mintatér elso sorát: :loop3 { H D }

Elágazás

[címtartomány]b[címke]

A b (branch) parancs hatására a script vezérlése a label címkét követo sorra adódik át; ha nem adtunk meg címkét, a vezérlés a script végére kerül, magyarul a mintatér tartalma kiíródik és új sort olvas be a sed. (A b parancs és a címke között megengedett a szóközök használata.)

Például a /^\.start/,/^\.stop/!b s/\(.*\)/> \1/

script hatására a .start- .stop parancsokkal kijelölt rész kivételével (figyeljünk a negáló '!' karakterre!) nem csinál semmit, mert a vezérlést a script végére adja át. A .start és .stop parancsok közti részen pedig minden sort elé elhelyez egy '> ' szekvenciát.

A branch parancs segítségével hurkokat is tudunk csinálni: :eleje parancs1 /minta/b eleje parancs2

A fenti programstruktúra alkalmazásával parancs1 mindaddig ciklikusan végrehajtódik, amíg a bemeneten van minta-ra illeszkedo sor; ha nincs, a script végrehajtása parancs2-vel folytatódik. Hasonló módon alakíthatóak ki egyéb ciklikus vezérlési szerkezetek is.

Page 114: unix kézkönyv

UNIX felhasználói ismeretek

116

Feltételes elágazás

[címtartomány]t[címke]

A t (test) parancs hatására a vezérlés akkor kerül a megadott címke utáni sorra, ha elozoleg a kurrens sorban sikeres behelyettesítés történt. Akárcsak a b parancsnál, címke elhagyása esetén a vezérlés a script végére adódik át. Az alábbi script a .pa makróutasítás helyett egy soremelés (CTRL-L) karaktert szúr be, a .pp makróutasítás helyett pedig egy újsor karaktert. Mindkét esetben, ha sikeres volt a behelyettesítés, a vezérlés a tovabb címkétol folytatódik; gyakorlatilag tehát egy C vagy shell nyelvi case konstrukciót szimulálunk: /^\.pa.*/s//^L/ t tovabb /^\.pp.*/s//\n/ t tovabb ... egyeb parancsok :tovabb

A fentiekben csak igen vázlatos áttekintését nyújtottuk a sed-nek, de azt talán sikerült bizonyítanunk, hogy rendkívül sokoldalúan használható eszköz lehet a felhasználó kezében. Csak bátorítani tudunk mindenkit használatára, mert a kezdeti erofeszítések sokszorosan kifizetodnek majd az elso komolyabb szövegátalakítás alkalmával.

Page 115: unix kézkönyv

117

8. FEJEZET

A VI EDITOR

A UNIX rendszerben több editor, eredendoen soreditor használatos. Ezekre az editorokra mind az jellemzo, hogy egy teletype orientált szemléletet tükröznek, ellentétben a PC-ken használatos és széles körben elterjedt képernyoorientált szövegszerkesztokkel. A UNIX edito-rai inkább programeditorok, de a hátrányokért cserében számtalan ügyes szerkesztési leheto-séget kínálnak.

A vi editor (az elnevezés a visual editor kifejezésbol származik) a sororientált és a képernyoorientált editorok különös (és bonyolult) keveréke. Számos szolgáltatása miatt a UNIX programozók körében igen közkedvelt, bár a mai modern editorokhoz szokott felhasz-nálók néha furcsának találhatják egyes vonásait. Elonye még, hogy ahol UNIX van, ott vi is található.

A vi editorral való ismerkedést bonyolítja, hogy a vi nem is egy, hanem több editor szorosan összenott együttese. A vi az ex editor fölé épül, amely az ed editor kibovített változata. A vi-ban való szerkesztés közben átléphetünk az ex editorba, végrehajthatjuk mondjuk annak glo-bális kereso és/vagy helyettesíto parancsait, majd ismét visszatérhetünk a vi-ba, ahol az elozo változtatások eredményét a képernyon kísérhetjük nyomon.

A vi különösképpen a kezdo felhasználók számára bonyolult és nehezen megszokható, ezért lehetoség van arra, hogy vedit néven indítsuk el: ekkor olyan beállításokkal üzemel a vi, amely a szokásosnál kissé bobeszédubb, jelzi a vi aktuális üzemmódját stb. Ha view néven indítjuk, csak olvasható módban nyitja meg az állományokat, csökkentve a véletlen törlés lehetoségét.

Page 116: unix kézkönyv

UNIX felhasználói ismeretek

118

A vi muködése, üzemmódjai A vi egy pufferbe olvassa be a szerkesztendo állományt. Minden módosítás, amit a fájlon végrehajtunk, ebben a belso pufferben tárolódik mindaddig, amíg egy írási paranccsal el nem mentjük.

A vi-nak alapvetoen háromféle üzemmódja van: a parancsmód, a beviteli mód, és az ex mód.

Parancsmódban (ez a vi kiindulási módja) a leütött billentyuket a vi parancsokként értelmezi és hajtja végre. Az ex módból is parancsmódba tér vissza, ha elvégezte a feladatát, és beviteli módból is ide térünk vissza, ha parancsot akarunk kiadni. Futó parancsot az ESC billentyuvel lehet megszakítani.

Beviteli módba akkor kerül a vi, ha az a A i I o O c C s S R parancsok valamelyikét adtuk ki. Beviteli módban a begépelt szöveg a szerkesztett állományba kerül, s ilyenkor semmilyen paran-csot nem lehet kiadni mindaddig, amíg a beviteli módból vissza nem lépünk parancsmódba, ren-desen az ESC billentyu lenyomásával. (A vi-nak ez a tulajdonsága az, ami a más editorokhoz szokott felhasználóknak a legtöbb gondot okozza, nevezetesen hogy a parancsmegadás és a szö-vegbevitel ennyire hermetikusan szét vannak választva egymástól. Ennek valószínu oka, hogy a UNIX-os gépek termináljai annak idején nem ismerték a PC-ken megszokott kurzormozgató- és funkcióbillentyuket.

ex módba akkor kerül a vi, amikor a : / ? ! karakterek valamelyikét ütjük le parancsmódban. Ekkor az ex editornak szóló parancsokat gépelhetünk be, a sorlezáró újsor karakter hatására a begépelt parancsokat az ex végrehajtja. A parancs végrehajtását a DEL billentyuvel sza-kíthatjuk meg.

Mivel inkább a gyakorlati felhasználó szemével szeretnénk látni és láttatni a vi-t, tárgyalásunk során eloször egy olyan minimális funkciókészletet mutatunk be, mellyel már biztonsággal használható a vi, ezt fogja követni az egyes parancsok funkciók szerint csoportosított részletesebb leírása. Kezdjük hát meg túránkat a vi körül! (Olvasóinknak azt javasoljuk, nyissanak meg egy fájlt – lehetoleg ne rendszergazdai jogosultságokkal és ne a legpótolhatatlanabbat... –, s azon gyakorolják az olvasottakat.) Az alábbiakban a parancskaraktereket vastagon szedett betuvel jelöljük. A ^ karakter a vezérlokaraktereket jelzi majd, így például a ^c jelölés a CTRL-C karakternek felel meg.

Page 117: unix kézkönyv

8. fejezet A vi editor

119

8. ábra: A vi editor üzemmódátmeneteirol

Ismerkedés – a túlélokészlet Egy fájlt a vi file paranccsal nyithatunk meg szerkesztésre; ha létezo fájlról van szó, a vi a fájl elejére áll, ha még nem létezett ilyen fájl, a képernyo alsó sorában egy "New file" vagy "Empty file" szöveg figyelmeztet minket. (Meghívhatjuk a vi-t fájlparaméter nélkül is, ez esetben legkésobb kilépéskor kell nevet adni neki.)

A megnyitott fájlban a villogó kurzor az elso sor elején jelzi, hogy a vi parancsra vár. Ha a képernyon a fájl vége (is) látható, a képernyo szélén a '~' (tilde) karakterek a már üres sorokat jelzik.

A vi egyik leggyakrabban szidott vonása szófukarsága; még gyakorlott felhasználóknak is rendkívül zavaró tud lenni, hogy nem látják, milyen üzemmódban vannak éppen. Elso lépésként ezért gépeljük be az alábbi parancsokat: :set novice :set showmode

Ennek hatására némileg megoldódik a vi nyelve, a továbbiakban a képernyo jobb alsó sarkában ki fogja írni, hogy milyen beviteli módban vagyunk éppen; ennek hiánya azt jelzi, hogy parancsmódban vagyunk. (Ha elvesztettük a fonalat, s nem tudjuk, épp milyen vi módban vagyunk, nyomjuk meg kétszer egymás után az ESC gombot, ennek hatására garantáltan "visszajutunk a kályhához", azaz parancsmódba. Mivel a legtöbb terminál a

Page 118: unix kézkönyv

UNIX felhasználói ismeretek

120

parancsmódban érkezo ESC karaktert egy fütyüléssel vagy villanással is honorálja, így ha a dupla ESC után fütyült a terminálunk, biztosak lehetünk abban, hogy parancsmódba kerültünk vissza.

Ahogy a kisbaba is eloször járni tanul meg, elsoként nézzük meg, mely alapveto parancsokkal mozoghatunk egy fájlban. A legfontosabbak a balra-le-föl-jobbra funkcióknak megfelelo parancsok. Ezeket a klaviatúrán rendre az egymás mellett lévo h j k l billentyuvel érhetjük el. (A legtöbb Unix rendszerben és terminálon ma már használhatóak a standard nyíl billentyuk is, ám ezek használata nem mindig javasolt. Ennek az az oka, hogy a kurzormozgató nyíl billentyuket a legtöbb terminál valamilyen ESC karaktert is tartalmazó 2-4 karakteres szekvenciával kódolja (például ESC [ A ). A rendszer leterheltsége esetén könnyen elofordulhat, hogy e karakterszekvenciák feldolgozása idoben elhúzódik, a vi egymástól független külön karakterként fogadja oket, s így egy nyílbillentyu lenyomásakor a vi az ESC miatt átlép parancsmódba, majd a kurzormozgató szekvencia többi karakterét vi parancsnak értelmezi.)

Ha nagyobb lépésekkel szeretnénk mozogni a fájlban, a b paranccsal az aktuális szó elejére ugorhatunk vissza, w paranccsal pedig a (jobbra) következo szó elejére. A 0 karakterrel az aktuális sor elejére, a $ karakterrel pedig a sor végére ugorhatunk. A H paranccsal a képernyo tetejére, az L paranccsal pedig a képernyo utolsó sorára ugorhatunk. A fájl tetszoleges sorára az nG paranccsal pozicionálhatunk, így 1G a fájl legelso sorába visz minket. Paraméter nélkül megadva G az utolsó sorba röpít. A legfontosabb pozicionáló parancsokat grafikus formában az alábbi ábra szemlélteti.

Page 119: unix kézkönyv

8. fejezet A vi editor

121

1G

H k 1 b h * l w $ j L G

Ha írni szeretnénk a fájl egy tetszoleges helyére, álljunk a kurzorral a kívánt helyre, majd adjuk ki az i (insert) parancsot. Ennek hatására azonnal beviteli módba kerülünk, s mint már mondtuk, az ESC karakter leütéséig minden, amit gépelünk, bekerül a fájlba. Az i parancs az elé a karakter elé szúr be, ahol a kurzor áll, az a karakter hatására pedig a kurzor után szúródik be szövegünk. Ha szöveg bevitele közben szeretnénk javítani, a BACKSPACE karakterrel törölhetünk egy karaktert. Speciális (például vezérlokarakterek) beviteléhez elobb a CTRL-V billentyut nyomjuk le, az ezután megadott karaktert a vi nem értelmezi, hanem beírja a fájlba. Például ha egy ESC karaktert szeretnénk beírni, a CTRL-V ESC karakterszekvenciát kell megadni; a vi a vezérlokaraktereket a ^c formátumban jeleníti meg a képernyon (az ESC például ^[ ), az ékezetes karakterek megjelenítése implementáció és beállításfüggo. A szövegbevitel után elobb-utóbb törölni is kényszerülünk... Ha néhány karaktert szeretnénk csak törölni, a kurzorral álljunk rá az elso törlendore, s adjuk ki az x parancsot; ennek hatására egy karakter törlodik. Ha többet szeretnénk, adjuk meg az x elott a darabszámot; így például 5x öt karaktert fog törölni, a kurzor feletti karaktert, s négy tole jobbra lévot. (Vigyázzunk, ha eközben a sor végére értünk, a maradék karaktereket balra haladva fogja törölni a vi, mintha a PC-s DEL funkcióból hirtelen BACKSPACE funkcióra váltana.) Ha egész sort szeretnénk törölni, a dd paranccsal az aktuális sort törölhetjük. Ha valamit elrontottunk, és rögtön észrevesszük a hibát, az u (undo) paranccsal vissza lehet állítani a legutolsó szövegmódosítás elotti állapotot. Ha végeztünk munkánkkal, a :w paranccsal tudjuk a módosított fájlt elmenteni, azaz visszaírni a vi pufferének tartalmát a merevlemezre. Kilépni a :q paranccsal léphetünk. Ha egy fájlt módosítottunk, és mentés nélkül akarunk kilépni, a vi nem hagyja: vagy el kell mentenünk a fájlt a :w paranccsal, vagy pedig a :q! paranccsal kell kilépnünk.

Pozicionáló parancsok Szavak, mondatok és egyéb szövegelemek

A pozicionáló parancsok elott ismerkedjünk meg néhány alapveto vi szövegobjektummal, nevezetesen a szóval, mondattal, bekezdéssel és a szekcióval. Ezek egyfelol abban segítenek bennünket, hogy nagyobb lépésekkel tudjunk mozogni a fájlban, másrészt ezekkel tudunk nagyobb összefüggo elemeket kijelölni szerkesztendo állományunkban.

Page 120: unix kézkönyv

UNIX felhasználói ismeretek

122

A szóra a vi két definíciót alkalmaz. A szukebb értelmezés szerint szó a kizárólag alfanumerikus karaktereket és '-' karaktert tartalmazó karaktersorozat. Az ilyen értelmezés szerinti szavak között ugrálhatunk a b és w parancsokkal, b mindig a baloldali, w pedig a jobboldali legközelebbi szókezdetet jelöli.

Tágabb értelmezés szerint a vi a szó részének értelmezi az összes, nem szóköz és sorvége karaktereket. E definíció szerint tehát a központozó karakterek is a szó részét képezik. Az eszerint definiált szavak közt a nagybetus B és W parancsokkal mozoghatunk.

A mondat a vi definíciója szerint szavak olyan sorozata, melyet szóköz vagy soremelés eloz meg, és vagy soremelés és üres sor, vagy egy központozó karaktert követo legalább két szóköz zár le. A mondat elejére és végére a '(' és ')' karakterekkel mehetünk.

A bekezdés (paragrafus) az üres sorokkal határolt sorok összessége. Bekezdés elejére illetve végére a '{' és '}' karakterekkel léphetünk.

A vi parancsok felépítése

A pozicionáló parancsoknak nem csak a fájlban való mozgáskor van szerepük, legalább ilyen fontos, hogy segítségükkel jelölhetjük ki egy-egy vi parancs hatókörét. Ennek megértéséhez röviden tekintsük át a vi parancsok általános felépítését.

Minden vi parancsot egy betu jelöl, melyet megelozhetnek és követhetnek opcionális argumentumok is. Egy vi parancs általános felépítése a következo:

argumentum parancs szövegobjektum

Az argumentumokkal leggyakrabban azt adjuk meg, hogy a szóban forgó parancsot hányszor ismételjük meg, de a késobbiekben látni fogjuk, hogy például a puffer- és markerjelölés is itt történik. A parancs után szereplo szövegobjektum pedig arra utal, hogy mekkora szövegterületre terjed majd ki a szóban forgó vi parancs hatálya. Mindez valóban száraznak tunhet, jöjjön hát néhány példa, az egyszerubbektol a bonyolultabbakig.

Legegyszerubb megoldásként egyes parancsokat megadhatunk önmagukban is, például az x parancs törli azt a karaktert, amelyen a kurzor áll. E parancsokat megelozhetjük sokszorozó argumentummal: a 3x parancs a kurzortól számított 3 karaktert töröl le, hasonlóképpen, az l parancs egy karakterrel jobbra mozgatja a kurzort a sorban, míg 10l hatására tíz karakternyit mozdulhatunk jobbra. E sokszorozó argumentum hatására tehát az adott parancs ismétlodik n-szer.

Más parancsok nem állnak meg önmagukban, paraméterek nélkül. Ilyen például a törlést végzo d parancs. A vi konvenciói szerint, ha egy ilyen parancs karakterét megduplázzuk, a parancs a teljes aktuális sorra fog vonatkozni. Esetünkben tehát a dd törli a kurrens sort. Ha viszont a parancs betuje után egy normál pozícionáló vi parancsot adunk meg, a törlési parancs hatálya a pillanatnyi kurzorpozíciótól addig a pontig terjed a fájlban, ameddig a pozicionáló paranccsal jutottunk volna. Így dw a pillanatnyi pozíciótól a következo szó elejéig töröl, d$ a sor végéig, d) a mondat végéig, d23G a huszonharmadik sorig, és így

Page 121: unix kézkönyv

8. fejezet A vi editor

123

tovább. Természetesen a pozicionáló parancsoknál is szerepelhetnek sokszorozó argumentumok, ahogy 3w azt jelenti, hogy három szót mozdulunk jobbra a kurzortól, úgy d3w azt jelzi, hogy három szót törlünk a kurzortól kezdve. Utóbbival viszont egyenértéku lesz a 3dw megadás, ami azt jelenti, hogy háromszor hajtunk végre szótörlést.

Pozicionálás karakterek alapján

h, <BACKSPACE> A kurzort egy karakterrel balra mozgatja. l, <SPACE> A kurzort egy karakterrel jobbra mozgatja. $ A kurzort a sor utolsó karakterére állítja. 0, A kurzort a sor elso karakterére állítja. n A kurzort a sor n-edik oszlopára állítja. ^ A kurzort a sor elso nem blank karakterére állítja. fx A kurzort jobbra mozgatja az elso x karakterre. Fx A kurzort balra mozgatja az elso x karakterre. tx A kurzort jobbra mozgatja, az elso x karakter elé. Tx A kurzort balra mozgatja, az elso x karakter mögé. ; A megelozo f, F, t, T parancsok által keresett karakter következo elofordulását

keresi. , Az f, F, t, T parancsok által elozoleg keresett karakter újabb elofordulását ke-

resi visszafelé.

Az összes itt felsorolt parancs a kurrens sorban muködik, beleértve a t és f parancsokat is.

Pozicionálás sorok alapján

j A kurzort egy sorral lejjebb mozgatja. k A kurzort egy sorral feljebb mozgatja. +, <CR> A kurzort lefele mozgatja, a következo sor elejére. - A kurzort felfele mozgatja, a felette lévo sor elejére.

Pozicionálás szavak alapján

w, W A kurzort a következo szó elso karakterére mozgatja. b, B A kurzort a megelozo szó elso karakterére viszi.

Pozicionálás mondatok alapján

( A kurzort a mondat elejére viszi. ) A kurzort a következo mondat elejére viszi.

Page 122: unix kézkönyv

UNIX felhasználói ismeretek

124

Pozicionálás bekezdések alapján

{ A kurzort a bekezdés elejére viszi. } A kurzort a következo bekezdés elejére viszi.

Pozicionálás a képernyon

nH A kurzort a képernyo elso (illetve n-edik) sorára viszi. M A kurzort a képernyo közepso sorára viszi. nL A kurzort a képernyo utolsó (illetve alulról az n-edik) sorára viszi.

Pozicionálás az állományban — görgetés

^f Teljes képernyonyit elore görget. ^d Félképernyonyit elore görget. ^b Teljes képernyonyit hátrafele görget. ^u Félképernyonyit hátrafele görget.

Pozicionálás sorszám alapján

^g Az alsó sorban kiírja a kurrens állomány státuszinformációit (név, módosítot-ták-e) és a kurzorpozíciót (sorszám/teljes sorok száma, százalékos pozíció az állományon belül).

G A kurzort a buffer utolsó sorának elejére állítja. nG A kurzort a buffer n-edik sorának elejére állítja.

Pozicionálás mintakereséssel

A / illetve a ? karakter leütése után a kurzor a képernyo utolsó sorába, az u.n. parancssorba kerül, a mintát ide kell folyamatosan gépelni. Természetesen amit itt írunk, az nem kerül a ja-vítandó szövegbe. /pattern A pattern minta következo elofordulását keresi a bufferben. A kurzor pattern

elso karakterére áll. Ugyanazon minta ismételt elofordulását a / karakter minta nélkül történo megadásával kereshetjük.

?pattern Visszafele keresi pattern következo elofordulását. A kurzort pattern elso ka-rakterére állítja. Ugyanazon minta ismételt elofordulását a ? karakter minta nélkül történo megadásával kereshetjük.

n Megismétli az utolsó mintakereso utasítást.

N Megismétli az utolsó mintakereso utasítást, de az azzal ellentétes irányba.

Page 123: unix kézkönyv

8. fejezet A vi editor

125

Szövegbeviteli parancsok a Beviteli módba kerül, az új szöveget a kurzor mögé írja.

A Beviteli módba kerül, az új szöveget az aktuális sor végéhez fuzi.

i Beviteli módba kerül, az új szöveget a kurzor elé szúrja be.

I Beviteli módba kerül, az új szöveget az aktuális sor elso nem üres karaktere elé szúrja be.

o Beviteli módba kerül, és új sort kezd az aktuális sor után. A sor tetszoleges helyén kiadható parancs.

O Beviteli módba kerül, és új sort kezd az aktuális sor elott. A sor tetszoleges helyén kiadható parancs.

Szövegmódosító (cserélo) parancsok A szövegmódosító parancsok hatására lényegében beviteli módba kerülünk, s a beírt szöveggel a kijelölt szövegobjektumot cseréljük le.

rc A kurzor felett lévo karaktert a c karakterrel helyettesíti.

R Felülíró üzemmódba kerülünk, az ESC lenyomásáig gépelt karakterek felülírják az aktuális sorban a karaktereket. Ha eközben elértük az eredeti sor végét, a vi append módba megy át, s a többi begépelt karaktert a fájl végéhez fuzi.

s A kurzor alatti egyetlen karakter helyére szúrja be az ESC karakterig begépelt szöveget. ns hatására a kurzortól számolt n karakter helyett szúrja be a begépelt szöveget. (Az s parancs megadásakor, s minden olyan parancsnál, amely behelyettesítést vagy cserét végez, egy $ karakter jelzi annak a tartománynak a végét, ameddig kiterjed a módosítás hatálya. Az ESC lenyomásakor a $ karakter eltunik.)

S A teljes aktuális sort cseréli le a behelyettesíto szövegre.

cx Az x szövegobjektumot helyettesíti az ESC karakterig begépelt szöveggel. Például cwalmaESC a kurzortól a következo szó elejéig terjedo részt cseréli le a begépelt alma szóval, c$ a sor végéig terjedo részt, és így tovább.

cc Az aktuális sort cseréli le a begépelt szöveggel.

C Az aktuális sort a kurzortól kezdve cseréli le a begépelt szövegre.

A fenti parancsok mindegyike megelozheto egy számkonstanssal, ezek értelemszeruen a szóban forgó parancs n-szeri megismétlodését jelenti. Például 3salmaESC a kurzorpozíciótól számolt 3 karaktert helyettesíti az alma szóval, 4cctextESC az aktuális sorral kezdve 4 sort cserél le a begépelt szövegre.

Page 124: unix kézkönyv

UNIX felhasználói ismeretek

126

Törlo parancsok Törlés parancsmódban

x Törli azt a karaktert, amin a kurzor áll.

dx A kurzortól kezdve törli az x szövegobjektumot. Például db a kurzortól visszafele a legközelebbi szó elejéig töröl, d$ a sor végéig, d( a kurzortól az aktuális mondat elejéig, d} az aktuális bekezdés végéig, 3d{ a kurzortól visszafele három bekezdést.

dd Törli az aktuális sort.

A fenti parancsok mindegyike megelozheto egy számkonstanssal, ezek értelemszeruen a szóban forgó parancs n-szeri megismétlodését jelenti. Például 3d} a fenti példával ekvivalens módon a kurzortól visszafele 3 bekezdést töröl.

Törlés beviteli módban

Beviteli módban viszonylag korlátozottak lehetoségeink mind navigálásra, mind javításra, illetve törlésre. A nyílbillentyukkel például beviteli módban rendszerint nem lehet mozogni a sorok között. Törlésre az alábbi parancsok használhatóak:

BACKSPACE Törli a kurzor elotti karaktert. Egyes terminálokon elofordulhat, hogy a törölt szöveg mindaddig nem tunik el a képernyorol, amíg új sorba nem lépünk, illetve le nem nyomjuk az ESC karaktert.

^w Törli a kurrens szót ( a szót blank karakterek határolják).

@ Törli az aktuális sorból a frissen beírt részeket.

Állományváltás és mentés Az alábbi parancsok a fájlok mentésével és a különbözo fájlok közti mozgással foglalkoznak.

ZZ Elmenti az aktuális fájlt és kilép belole.

:wfile file néven lemezre írja (elmenti) a fájlt. Ha létezo fájlt editáltunk, file megadására nincs szükség. Ha más nevet adunk meg, mint a megnyitott fájl, akkor e néven is csinál egy aktuális kópiát, de az eredeti és az új fájl egymástól független lesz, s továbbra is az eredeti fájlban maradunk.

:w!file Akkor is elmenti (írja) a fájlt, ha az írásvédett. (Természetesen csak akkor, ha mi tettük rá az írásvédelmet!)

Page 125: unix kézkönyv

8. fejezet A vi editor

127

:q Kilép a vi-ból. Ha módosítottuk az állományt, és még nem mentettük el, figyelmeztet erre, s nem hagy kilépni, csak akkor, ha vagy elmentettük, vagy a :q! paranccsal "eroszakoskodunk" vele.

:q! Mindenképpen kilép, az állomány módosultságának további vizsgálata nélkül.

:e file Az éppen szerkesztett állomány helyett file-t nyitja meg editálásra, azaz betölti a bufferbe. Ha az elozoleg szerkesztett állományt módosítottuk elozoleg, akkor figyelmeztet a mentésre, és csak a mentés végrehajtása, vagy a :e! file parancs hatására kapcsol át az új file-ra.

:e!file A régi állomány mentése nélkül kapcsol át file-ra.

:e# Az :e paranccsal történo állományváltáskor az utoljára megnyitott fájl is hozzáférheto a :e# paranccsal. A vi mindig a két legutoljára megnyitott állomány között képes váltani a :e# paranccsal. Ha a vi-t a vi file1 Unix paranccsal indítottuk, majd az :e file2 paranccsal átléptünk file2-re, akkor file1 és file2 között váltogathatunk; ha azonban file2-ben tartózkodva kiadjuk a :e file3 parancsot, akkor a :e# a továbbiakban file2 és file3 között fog váltani.

:e!# A régi elmentése nélkül lép át az alternatív állományba

Lehetoség van a vi-ban arra is, hogy rögtön indításkor egyszerre több állományt nyissunk meg, mint például a vi file1 file2 file3 paranccsal; az alábbi vi parancsok ebben az esetben használhatóak.

:n A vi az argumentumlistában híváskor megadott következo fájlra megy át, hasonlóan az :e parancshoz, azaz figyelmeztet arra, ha módosított fájlról próbálunk mentés nélkül továbblépni.

:n! Mentés nélkül lép át a következo fájlra.

:rew Az argumentumlistában megadott elso fájlra lép vissza (mindazon harcedzett veteránok, akik erre gyanakodva kapták fel fejüket, megnyugodhatnak: ez valóban a mégnesszalagos perifériák rewind parancsának osi mélységeit idézo rövidítés...).

Speciális parancsok u "Visszacsinálja" a legutolsó parancsot. Alternáló parancs, így két egymás utáni u

parancs a visszacsinálás elotti állapotot állítja vissza.

U A kurrens sort állítja vissza változtatás elotti állapotába, feltéve, hogy még rajta állunk a kurzorral.

. Megismétli a legutolsó puffermódosulással járó, tehát szöveglétrehozó, törlo, vagy módosító parancsot.

J Az aktuális sort és a következot egy sorba vonja össze. A két sor között az újsor karakter helyett egy szóköz karaktert helyez el.

Page 126: unix kézkönyv

UNIX felhasználói ismeretek

128

^l Újrarajzolja az aktuális képernyot. Kiváltképpen akkor hasznos, ha valami rendszerüzenet belerondított képernyonkbe.

~ A kurzor alatti karaktert kisbeturol nagybeture, illetve nagybeturol kisbeture konvertálja.

Jelzopontok (markerek) A jelzok (markerek) hasznos lehetoséget nyújtanak tájékozódási és kijelölési pontok létrehozására a szerkesztés közben. Felhasználhatjuk oket arra, hogy a megjelölt helyre késobb visszataláljunk, de arra is, hogy velük jelöljük ki egy-egy parancs hatókörét. (A jelzokijelölés is csak egy nyitott fájlra érvényes, azt a fájllal együtt nem menti el a vi.)

mc Az mc paranccsal, ahol c tetszoleges kisbetu lehet, helyezünk el egy jelzopontot a fájlban.

'c Visszavisz a c jelzopontot tartalmazó sor elejére.

`c Pontosan a jelzoponttal megjelölt karakterre visz vissza.

Néhány példa: a d'a parancs hatására a kurzortól az ma paranccsal elhelyezett jelzopont sorával bezárólag töröl a vi. A d`a parancs hatására a kurzortól a jelzopont karakterig töröl.

Pufferkezelés Névtelen és nevesített pufferek

A vi a "fo" pufferen kívül, ahol a szerkesztett állományt tartja, még számos egyéb kiegészíto puffert is használ. Ezeknek elsosorban a komplexebb szövegmozgatásoknál, vagy a fájlok közti adatcserében láthatjuk hasznát.

A vi összesen 36 puffert bocsát rendelkezésünkre. Ezek között van egy névtelen, melyet automatikusan használunk minden olyan vi muveletnél, ahol valami módosult a fájlban; a változtatás által érintett, "elveszo", felülírandó szövegrészlet kerül ide. (Rövidesen látni fogjuk, hogyan nyerhetjük ki e puffer tartalmát.) A következo 9 puffert, melyekre a "n jelöléssel hivatkozhatunk (n a megfelelo puffer száma), szintén automatikusan használjuk, ugyanis ezekbe shiftelodik el a névtelen puffer tartalma minden egyes újabb puffermódosító muveletnél. Pontosabban fogalmazva, minden állománymódosítással járó parancsnál a frissen törölt szövegrész kerül a névtelen pufferba, ami eddig ott volt, az az egyesbe, és így tovább.

A maradék 26 pufferre (vagy másnéven regiszterre) a "c formulával hivatkozhatunk, ahol c az angol ábécé egy kisbetuje lehet.

Page 127: unix kézkönyv

8. fejezet A vi editor

129

A regiszterhivatkozásokat mindig az opcionális számparaméter után, de még a vi parancs elott kell elhelyezni, így egy vi parancs legkomplexebb formája az alábbi lehet:

argumentum regiszter parancs szövegobjektum

A fentiekre mindjárt látunk példákat is.

Szövegmásolás: p és y parancs

Eddigi parancsaink közvetlen hatással voltak a szerkesztett fájlra, valamit töröltek, vagy valamit valamire cseréltek. Az alábbi parancsok a pufferkezeléssel kapcsolatosak.

yx A y (yank) parancs hatására az x szövegobjektum a névtelen pufferbe kerül. y a d parancshoz hasonlóan muködik, az egyetlen eltérés, hogy a pufferbe tett részt nem törli eredeti helyérol. x az eddig megszokott módon kijelölheto tetszoleges szövegobjektum lehet.

yy Az aktuális sort helyezi a névtelen pufferbe.

p A névtelen puffer tartalmát a kurzor karakter mögé szúrja be. Ha a névtelen pufferben egy vagy több teljes sor szerepel, akkor a kurzort tartalmazó sor után helyezi el oket.

P A névtelen puffer tartalmát a kurzor karakter elé szúrja be. Ha a névtelen pufferben egy vagy több teljes sor szerepel, akkor a kurzort tartalmazó sor elott helyezi el oket.

Ne felejtsük el, hogy a névtelen pufferbe explicit módon csak a y paranccsal pakolhatunk, viszont minden állománytörléssel járó parancs eredménye automatikusan oda kerül, esetlegesen felülírva az általunk ott elhelyezett szöveget. Célszeru ezért a yank paranccsal elhelyezett információt minél hamarabb kivenni a pufferbol, vagy pedig a 26 regiszter valamelyikét használni, amelyeket az automatikus mentés nem érint.

Az alábbi példák a p és y parancsok használatát mutatják be:

xp Két karakter cseréjére alkalmas: törli a kurzor alatti karaktert (a kurzor a következo karakterre kerül), majd a névtelen puffer tartalmát (azaz a frissen törölt karaktert) a kurzor után helyezi el. Magyarul megcseréltük a két karaktert, például amla helyett alma került a fájlba.

4y) A kurzortól kezdve négy mondatot a névtelen pufferbe másol.

"4p A megelozo harmadik fájlmódosítás által elvesztett szöveget a kurzor mögé helyezi.

"zd3w A kurzortól elore 3 szót töröltünk, s a z regiszterben helyeztük el.

"zp A z regiszter tartalmát a kurzor mögé szúrtuk be.

"ty`a A kurzortól az a jelzopontig kijelölt részt a t regiszterbe másolja.

Page 128: unix kézkönyv

UNIX felhasználói ismeretek

130

Vágás-ragasztás

A jelzopontok és regiszterek használatával szinte határtalan lehetoségek nyílnak meg elottünk, fájlok tetszoleges részeit tudjuk kijelölni, és egy paranccsal mozgatni. Nem említettük még a regisztereknek azt a nagy elonyét, hogy az egyszerre megnyitott összes fájlból elérhetoek, azaz akár fájlok közti "húzd és vidd" (drag-and-drop) muveleteket is meg tudunk valósítani, ha eléggé "fapados" módon is. Alábbi példánk ezt szemlélteti.

Tegyük fel, hogy már megnyitottuk a file1 nevu állományt, s ennek egy részét szeretnénk áthelyezni a file2 állományba, mégpedig úgy, hogy a kutya és a macska szó elso elofordulásai közti részt tesszük át file2-be, a haziallatok kezdetu sor után (az alábbi parancsok természetesen sorfolytonosan gépelhetoek, csak a jobb láthatóság miatt szeparáltuk oket külön sorokba, s kivételesen külön jelöltük az újsor karaktereket): 1G/kutya/RETURN ma /macska/RETURN "bd'a :efile2RETURN /haziallatok/RETURN "bp :e#RETURN

Az 1G/kutya/RETURN hatására a kurzor file1 elso sorára áll, onnan megkeresi a kutya szót tartalmazó sort és rááll. Az ma parancs hatására elhelyez egy jelzopontot ezen a soron. /macska/RETURN hatására rááll a macska szót tartalmazó sorra. "bd'a hatására törli a kurzortól az a jelzopontig tartó szövegrészt, de a névtelen puffer helyett a b regiszterben helyezi el. :efile2RETURN hatására megnyitja file2-t is, /haziallatok/RETURN hatására rááll a haziallatok szót tartalmazó elso sorra, végül "bp hatására e sor mögé beszúrja a b regiszter tartalmát. :e#RETURN hatására visszaáll file1-be, a kitörölt, macska szót tartalmazó sor utáni elso sorra.

Fájlmuveletek és külso shell parancsok Az alábbiakban azokkal a parancsokkal ismerkedünk meg, amelyek fájlmuveletek végzését és külso parancsok végrehajtását teszik lehetové a vi alól.

Külso parancs végrehajtása vi alól

Gyakran szükségünk lehet egy-egy Unix parancs kiadására a vi alól, s ilyenkor kényelmetlen kilépni, majd újraindítani az editort. A :!unix_parancs

Page 129: unix kézkönyv

8. fejezet A vi editor

131

formátumú utasítás hatására végrehajtódik unix_parancs, eredménye a képernyonkre íródik, innen egy újsor karakter leütésére kerülünk vissza elozo képernyonkre. Ebben az esetben semmiféle kapcsolat nincs a vi által editált fájlunk és a cmd parancs között, így arra sincs lehetoségünk, hogy adatokat cseréljünk a futtatott paranccsal. Az alábbi parancs hatására azt nézzük meg, hogy melyik katalógisban tartózkodunk éppen: :!pwd

Fájlok írása-olvasása

A vi lehetoséget nyújt arra, hogy a szerkesztett állomány tetszoleges pontjára beszúrjuk egy másik fájl tartalmát, illetve a szerkesztett fájl egy részét másik fájlba írjuk.

:[sorcím]r file Hatására a kurzor mögé, illetve címmegadás esetén az adott sorba beszúródik file tartalma.

:[címtartomány]w file Hatására a szerkesztett fájl címtartomány által definiált része (címmegadás hiányában a teljes fájl) beíródik a file állományba.

címtartomány illetve sorcím az ed és sed editoroknál már tárgyalt módon adható meg, akár abszolút, akár relatív sorszámok, akár reguláris kifejezéssel megadott minták formájában. Néhány példa: :23r text

A szerkesztett fálj 23. sora után beszúrja text állományt. :1,.-1w rovid.txt

A szerkesztett fájl elejét (az aktuális elotti sorral bezárólag) kimenti rovid.txt néven. :1,/^_end/w t1.doc

A fájl elejétol a sor eleji _end mintát tartalmazó sorig kimenti a t1.doc fájlba a szerkesztett állományt.

Puffermuveletek

Még érdekesebb és hasznosabb lehet, ha Unix parancsok eredményét tudjuk valahogyan beépíteni fájlunkba, netán a fájl egyes részeit Unix parancsokkal, szurokkel tudnánk manipulálni. Erre is megvan a lehetoség, s ez teszi igazán rugalmassá és sokoldalúvá a vi-t. Számos vi parancsnál (pontosabban az ex üzemmódú parancsoknál) lehetoség van a vi belso puffereinek felhasználására fájlmuveletek során; ilyenkor a '!' karakter jelzi a vi számára, hogy külso parancsot kell végrehajtani, mely értelemszeruen ír vagy olvas a belso pufferbol. :[sorcím]r ! parancs

Hatására a megadott sor után beszúródik parancs eredménye.

Page 130: unix kézkönyv

UNIX felhasználói ismeretek

132

! szövegobjektum parancs

Hatására az aktuális fájl szövegobjektum által kijelölt részén végrehajtódik parancs, s ennek eredményével helyettesítodik az eredeti szövegobjektum. A c,d és más szövegmódosító vi parancsoknál megszokott módon, ha a parancskaraktert (esetünkben a felkiáltójelet) megduplázzuk, az a kurrens sorra fog vonatkozni, azaz vi az aktuális sort fogja helyettesíteni parancs eredményével. (Az elso próbálkozásokkor kicsit zavaró lehet, hogy amikor a kezdo felkiáltójelet begépeljük, semmi sem történik, a következo karakterek begépelésekor megjelenik ugyan, de cserébe a szövegobjektum megadására vonatkozó karaktereket láthatatlanul kell begépelni.)

Néhány példa a puffermuveletek alkalmazására: :r !date

A kurrens sor mögé beszúrja az aktuális dátumot. Figyeljünk a következonél a különbségre: !!date

a kurrens sort lecseréli az aktuális dátumra.

A következo parancs ekvivalens a :r /etc/hosts paranccsal, a kurzor mögé beszúrja a /etc/hosts fájl tartalmát: :r !cat /etc/hosts

Alábbi példánk akkor lehet hasznos, ha például ékezetes szöveget szerkesztettünk, s emailben szeretnénk elküldeni egy olyan levelezoprogrammal, amelyik nem konvertálja automatikusan küldheto formátumra az ékezetes szöveget: :1,G !uuencode txt.uu

A fenti parancs a teljes fájlt helyettesíti az uuencode paranccsal kódolt változatára.

Az alábbi parancs a kurrens bekezdést a fold paranccsal maximum 72 karakter hosszúságú sorokra tördeli: !}fold -w 72

Komplex keresések és behelyettesítések A vi alatt (megint csak ex üzemmódban) lehetoség van mindazon keresések és behelyettesítések elvégzésére, amire az ex és az általunk tárgyalt sed editor képes. Az ex üzemmódot bevezeto parancskezdo kettosponttól eltekintve a szintaxis megegyezik a sed editornál tanultakkal, ezért itt bovebben nem térünk ki rá. Az alábbi példa a DOS formátumú fájlok CR-LF (kocsivissza-soremelés) karaktereit konvertálja unixos LF (soremelés) formátumra: :1,$s/^M$//

Page 131: unix kézkönyv

8. fejezet A vi editor

133

(Emlékezzünk, a CTRL-M (CR) karaktert beírás elott a CTRL-V karakterrel kell levédenünk.) Ugyanezt a parancsot egy picit egyszerubben is beírhatjuk, az 1,$ tartományra használhatjuk a '%' rövidítést is: :%s/^M$//

Rövidítések és makrók A vi alatt lehetoség van bizonyos billentyukhöz megadott parancsokat vagy ka-rakterszekvenciákat rendelni. E makrók, illetve rövidítések használata adott körülmények között sok felesleges munkától és gépeléstol menthet meg minket. Rövidítéseket a :ab (abbreviation) paranccsal definiálhatunk, feloldásukat pedig a :una (unabbreviation) paranccsal érhetjük el. (A parancsok teljes nevét is végiggépelhetjük, de ekkora mazochizmust egyik olvasónkról sem tételezünk fel, kiváltképp, ha a vi sem kényszerít erre minket...:-)

:ab rövidítés kifejtés

:una rövidítés

rövidítés jelzi az általunk használt kifejezést, kifejtés pedig a vi által behelyettesített kifejezést. :ab ux SVR4 UNIX (TM)

hatására, valahányszor a szerkesztett szövegben az ux szót leírjuk, a vi az SVR4 UNIX (TM) mintát fogja a helyére behelyettesíteni. A rövidítés feloldását az :una ux

paranccsal érhetjük el.

Makrókat a :map és :map! parancsokkal definiálhatunk. Formátumuk a következo: :map m makró_parancs :map! m makró_parancs

ahol m a szóban forgó makróhoz rendelt billentyu, makró_parancs pedig maga a ténylegesen végrehajtandó makróutasítás. Az elso formátum csak parancsmódban használható, azaz a vi beviteli módban nem értelmezi és fejti ki a makróutasítást. A második megadási forma esetén szövegbeviteli módban is értelmezodik a makró. Mivel a vi az ábécé legtöbb betujét lefoglalja parancsoknak, gyakran legalább akkora ügyességet igényel a makróhívó karakter kiválasztása, mint a makró megírása. makró_parancs írásakor vigyázzunk, hogy betuhelyesen írjuk a végrehajtandó utasításokat, épp úgy, mintha interaktívan gépelnénk be végrehajtáskor; ez többek közt azt jelenti, hogy az újsor karaktereket is meg kell adni a makróleírásban, ha a makróra tett parancsot is újsor karakterrel kell befejezni. (Ne feledjük a vezérlokaraktereket a CTRL-V karakterrel levédeni!). Néhány példa, csak étvágygerjesztonek (a betuhelyes megadás igénye miatt kivételesen minden leütött karaktert jelölünk):

Page 132: unix kézkönyv

UNIX felhasználói ismeretek

134

:map CTRL-V CTRL-X !}fold -s 72 CTRL-V CTRL-M

A fenti makró a ^x karakterhez egy szövegtördelo makrót köt, ami a kurrens bekezdést a fold -s 72 paranccsal a megfelelo hosszúságú sorokra tördeli. (Mivel egy ex parancsot tettünk makróra, kell az újsor karakter a végén.) :map t 1G!Guuencode tmp.uu

Ezt a makrót a sima t karakterhez kötöttük, hatására a kurzorral a fájl elejére megyünk, majd a végéig kijelölt részt (azaz az egész fájlt) ráengedjük az uuencode parancsra, s a kódolt változattal cseréljük le az eredetit. Vegyük észre, hogy ezzel ekvivalens (csak hosszabb) az alábbi makródefiníció: :map t :%!uuencode tmp.uu CTRL-V CTRL-M

Végül az alábbi makró a ^a karakter hatására beszúr a fájl legelejére egy # Date: kezdetu sort, a napi dátummal: :map CTRL-V CTRL-A 1GO# Date: CTRL-V ESC :r !date CTRL-V CTRL-M J

A fenti makró 1G hatására a fájl elejére áll, az O parancs hatására új sort szúr be a kurzor elé (tehát ez lesz az új elso sor), beírja a fejrész szövegét, majd ESC karakterrel lezárja a sort (ekkor a kurzor az új sor végén áll). A :r parancs a date eredményét a kurzor utáni sorba szúrja be (a kurzor ettol még marad az elso sorban), végül a J parancs segítségével a két új sort összevonjuk.

A vi konfigurálása A :set parancs és a vi belso változói

A vi (és az ex) testreszabását a vi szerkesztés közben kiadott :set paranccsal érhetjük el. Ha paraméter nélkül hívjuk meg, mindazokat a belso változókat listázza ki, amelyek értékét az alapértelmezéstol eltéroen állítottuk be. A

:set all

parancs hatására az összes állítható belso változó nevét és értékét kiírja a vi. A szokásos konvenció szerint az egyes változók nevét nem kell végigírni, csak addig, ahonnan már egyértelmu, ezen kívül egyedi rövidítések is vannak, így például a

:set autoindent

parancsot a

:set ai

megadással is írhatjuk. Ha egy változót le akarunk tiltani, akkor a no elotaggal kell megadni, elozo példánkban maradva a

:set noautoindent,

Page 133: unix kézkönyv

8. fejezet A vi editor

135

vagy

:set noai

paranccsal. Hely hiányában nem térünk ki itt az összes opcióra, csak a legfontosabbakat foglaljuk össze.

autoindent Beugratott bekezdéseket lehet végrehozni szövegbeviteli módban, azaz a következo sort mindig azon a karakterpozíción kezdi, ahol az elozo volt. Ha egy új bekezdésben a sor elejérol akarunk indulni, a CTRL-D karakter hatására lehet ilyenkor a sor elejére ugrani (ne felejtsük, szövegbeviteli módban vagyunk, a szokásos vi parancsokat ilyenkor nem használhatjuk).

showmode novice Bobeszédu üzemmódra állítják a vi-t, többek közt jelzi a beviteli módokat.

number Megsorszámozza a sorokat (csak a képernyon, nyomtatásban nem jelentkezik).

report=n Ha egy utasítással n sornál többet módosítottunk (másolás, törlés, behelyettesítés), kiírja a képernyo alján.

showmatch A zárójelpárokat mutatja meg a képernyon, s ha egy zárójelen áll a kurzor, a '%' karakter hatására rááll a párjára.

tabstop=n A képernyon az n-edik karakterekre állítja a tabulátort.

A vi és ex konfigurációs fájljai

A :set paranccsal történo beállítások csak az adott interaktív szerkesztés alatt érvényesek, s utána elvesznek. Ha állandó jelleggel be akarunk állítani valamilyen editor paramétert, legcélszerubben a saját kiindulási katalógusunkban elhelyezett .exrc nevu fájlban tehetjük meg. A másik lehetoség az EXINIT környezeti változó használata.

Az editorok összehasonlítása Az elobbiekben megismerkedtünk három a UNIX operációs rendszer alatt használatos editor-ral. A DOS-os világban járatosak valószínuleg a vi-t fogják legszívesebben használni, mert azzal teljes képernyon tudnak dolgozni. Új állomány létrehozásakor ez a legjobb lehetosé-günk. Állományok javításakor azonban már érdemes elgondolkodni más lehetoségeken is. Mert, ha csak egy-egy sorban kell változtatnunk, az ed sokkal gyorsabb eszköz. Másrészt, ha egy állomány nagyon sok során, esetleg mindegyiken ugyanazt a változtatást kell tennünk, nyilván célszeru a sed használata. Ilyen utóbbi eset lehet bizonyos helyesírási hibák javítása is.

Page 134: unix kézkönyv

136

9. FEJEZET

SEGÉDPROGRAMOK

E fejezetben a leggyakrabban használt UNIX segédprogramokkal (utility) ismerkedünk meg, a következoben pedig a UNIX shell azon finomságaival, amelyek lehetové teszik az egyes programok zökkenomentes együttmuködését. A cél az, hogy rámutassunk a UNIX rendszerfi-lozófiájára, arra, hogy hogyan érdemes már meglévo, esetleg igen primitív programok (sot, „programocskák”) összeépítésével meghökkentoen bonyolult és komplex feladatokat ellátó újabb programokat létrehozni anélkül, hogy akár egyetlen programsort is kelljen írni assembly-ben, vagy akár C nyelven. A hatékony programozást is segíti a UNIX az ilyen meg-oldások révén, hiszen ez végül is nem más, mint a mostanában igen divatos prototyping, azaz amikor a programozó eloször nagyvonalakban hozza csak létre az implementálandó progra-mot, s amit csak lehet, azt minél magasabb szintu nyelven írja meg (például a shell program-nyelvén). A kész program elkészülte után pedig még mindig ráér hatékonyságvizsgálatokat végezni, s a programrendszer szuk keresztmetszetének bizonyuló részeket valamilyen hatéko-nyabb nyelvre átírni.

Meg kell jegyeznünk, hogy a UNIX parancsok nagy száma miatt nem tudunk teljességre töre-kedni, illetve az ismertetett parancsok esetében is csak a legfontosabb opciókra szorítkozunk. (A minimálban az érintett parancsok részletesebb leírása is megtalálható.) Reményünk szerint azonban elég teljes a bemutatandó készlet ahhoz, hogy a feladatok jelentos részének elvégzé-sét szolgálja, másrészt a példáink segítik majd azokat, akik új parancsokat keresnek ki doku-mentációikból, és próbálgatják azokat.

Page 135: unix kézkönyv

9. fejezet Segédprogramok

137

A visszatérési érték

Mielott a UNIX parancsokat részleteznénk, elorebocsátunk egy új fogalmat, az exit státus1 fogalmát, ami a parancsok végrehajtásának sikerességérol informál. Nagyon sok UNIX pa-rancs, de nem mindegyik, állítja ezt az értéket, amit a shell-ben a ? változó $? alakú lekérde-zésével tudhatunk meg. Ott ahol fontos, a parancsok ismertetésekor leírjuk az exit változó be-állítását, ahol nem írjuk, ott általános szabály, hogy a sikeresen lefutott parancs 0-ra állítja, ellenkezo esetben egy ettol eltéro értékre. Vannak parancsok, amik nem állítják ezt a változót, egyszeruen érintetlenül hagyják. Egyes szurok esetében több információt is kapunk mint az egyszeru sikeres befejezés. A rendszer interaktív használatánál ugyan nem sok hasznát vesszük ennek, de a következo fejezetben megismerkedünk a shell-programozással, és akkor majd értékelni fogjuk ezt a rendszerszolgáltatást.

Szurok A fenti muködési mechanizmus egyik legfontosabb eszköze a pipe (cso, csovezeték), amely-nek révén az egyes programok láncba kapcsolhatóak. Nem véletlen ezért, hogy a UNIX prog-ramok elsöpro többsége a pipe-ban való muködésre felkészülve a standard input és output csatornák használatát támogatja. Az ilyen programokat a szemléletes UNIX zsargon szurok-nek nevezi. A továbbiakban a UNIX utility-k ismertetése során túlnyomórészt ilyen szurokrol lesz szó. DOS-ban járatos olvasóinkat emlékeztetjük, hogy szurok ott is vannak ugyan ( find, more, sort ), de lényegesen kisebb számban, és kisebb szabadsággal a parancsargumentumok meghatározása terén.

Nézzünk néhány szurot, a leggyakrabban eloforduló feladatok tükrében!

Állományok rendezése Állományok rendezésére a standard Unixban egyetlen, ámde igen eroteljes parancs áll rendelkezésre, a sort. Muködése kitunoen alkalmas a szabványos Unix szurési mechanizmus ismertetésére is. Alapveto szintaktikus formája a következo (a részletes opcióleírást lásd a Minimanuál c. fejezetben): sort [opciók] [bemenet]

1 Az exit status fogalmának elnevezésére nem honosodott meg stabil kifejezés. A könyvben még használni fogjuk az exit változó és a visszaadott érték kifejezéseket is.

Page 136: unix kézkönyv

UNIX felhasználói ismeretek

138

Ha bemenet nincs megadva, a standard inputot olvassa és rendezi (ezt explicit módon is megadhatjuk, a - karakterrel). A kimenet alapértelmezés szerint a standard output, a -o kimenet opcióval lehet egy fájlba irányítani a rendezés eredményét. (Érdemes vigyáznunk arra, hogy ha a -o opció megadása nélkül, a sort bemenetének és kimenetének ugyanaz a fájlt adjuk meg, akkor a rendezés tönkreteszi azt; ilyen esetben a -o opció használata kötelezo.)

Alapértelmezésben a sort parancs soronként, ASCII karakterérték szerint, növekvo sorrendben, a teljes beolvasott sorokat összehasonlítva rendezi a bemenetet. A -r opció hatására a rendezés sorrendje fordítható meg, a -n opció hatására pedig nem ASCII karakterértékként, hanem számként hasonlítja össze a beolvasott sorokat. (Nemcsak egész, hanem elojeles tizedespontos számokat is tud a sort rendezni.) Például a

ps | sort -n

parancs hatására a futó folyamatokat a processzazonosítók szerintve listázhatjuk ki.

Karakter szerinti rendezésnél fontos lehet a -d opció, ennek alkalmazásával úgynevezett szótári rendezést hajtathatunk végre, ekkor csak a betuk, számjegyek, valamint a szóköz és tabulátor karakterek játszanak a rendezésben. A -f opció hatására a kis- és nagybetus karaktereket egyformán kezeli a sort, azaz esetérzéketlen rendezést érhetünk el. Meglepoen hasznos lehet a -M opció, ennek hatására az összehasonlított mezo elso három karakterét angol hónapnevek rövidítéseként kezeli a sort, és eszerint rendez (érvénytelen < JAN < FEB < ... < DEC sorrendben).

Eddig nem említettük a sort egyik legfontosabb erényét, miszerint nemcsak a teljes sort összehasonlítva rendezhetjük a bemenetet, hanem azon belül egyes mezoket rendezési kulcsként megadva, kulcsonként, méghozzá több kulcs szerint is. Alapértelmezés szerint a bemenet mezoi a szokásos shell értelmezés szerinti önálló, tehát szóköz és tabulátor karakterekkel megadott szavak, de a -tc opcióval tetszoleges más mezohatároló karaktert is kijelölhetünk.

A rendezési kulcsokat a +m[.n] -p[.q] szintaxissal adhatjuk meg; a + jellel kezdodo opció mondja meg, hogy a rendezési kulcs hol kezdodik, a - karakterrel megadott opció pedig a mezo végét. m.n az m-edik mezo n-edik karakterét adja meg (a mezoket és karaktereket a sort 0-tól számozza!). A mezon belüli karaktermegadás elhagyható, ilyenkor értelemszeruen a kulcskezdo mezo elso, illetve a kulcszáró mezo utolsó karakterét jelenti. Hogy kicsit világosabbá tegyük: sort -n -t: +2 -3 /etc/passwd

hatására a passwd fájl tartalmát a harmadik mezo numerikus értéke szerint fogja rendezni, a mezoket pedig a ':' karakter fogja határolni. Más szóval a felhasználói azonosítók értéke szerint rendezve íratjuk ki a fájlt. Ne felejtsük, hogy a sort parancs a mezoket nullától számozza, fo a változatosság alapon... sort -n -t: +3 -4 -n +2 -3 -o /etc/passwd /etc/passwd

hatására eloször a password fájl negyedik mezoje (felhasználói csoportazonosító) alapján rendez, ha két sor ennek alapján azonos, akkor másodlagos kulcsként a harmadik mezo, azaz

Page 137: unix kézkönyv

9. fejezet Segédprogramok

139

a felhasználói azonosító alapján rendez - mindkét mezo tartalmát numerikus értékként kezelve. A rendezett fájlt visszaírja a /etc/passwd fájlba. Következo példánkban a

sort -n +2.4 my_data

parancs hatására a my_data nevu fájlt rendezzük, a rendezési kulcs pedig a harmadik mezo ötödik karakterétol a sor végéig tart. Végül utolsó példánkban olyan adatokat rendezünk sorba, ahol a sorok elején az angol megadás szerinti dátumokat (pl. Aug 23, 1995) várunk:

sort -n +2 -3 -M +0 -1 -n +1 -2

Végül még két fontos opciót említünk meg: a -m hatására két elozetesen már rendezett fájlt fésül össze egybe, a -u pedig a rendezésnél azonosnak talált sorokból csak egyet ír a kimenetre. (Utóbbi esetben érdemes vigyázni, ha ugyanis nem a teljes sor szerint rendezünk, akkor a rendezési kulcs szerinti azonosság nem jelenti azt, hogy a két sor azonos is!)

Mintakeresés állományokban Az elozoek során említettük már a grep programot, amelyik arra szolgál, hogy egy adott minta elo-fordulásait keresse a paraméterként megadott állományokban. $ cat semmi ***** Ez semmi ***** ***** alma korte repa retek alma mogyoro alma barack korte mogyoro narancs $ grep a semmi alma repa alma alma barack narancs

A minta, amivel kiválasztottuk a kívánt sorokat egy reguláris kifejezés, jelenleg az a betu. Természetesen dolgozhat a grep mint egy pipeline tagja is.

Page 138: unix kézkönyv

UNIX felhasználói ismeretek

140

$ ls -l | grep '^d'

A fenti parancs az ls -l parancs kimenetérol kiválasztja a d betuvel kezdodo sorokat, azaz a katalógusokat, és csak azokat engedi tovább. Sokszor használható ügyes eszköz a grep akkor is, ha az állományaink közt keresünk egyet a tartalma alapján. $ grep '^main' *.c

A fenti utasítássor a .c kiterjesztésu állományokból az(oka)t a sorokat fogja kilistázni, amely(ek) a main kulcsszóval kezdodnek. A példákból látható, hogy a mintát idonként idézo-jelbe tettük, idonként nem. Az idézojelek használata akkor célszeru, ha a minta a shell által is értelmezett speciális karaktert (pl. *?) is tartalmaz. A grep parancs nem tud minden reguláris kifejezést, mint mintát elfogadni, ezért hasznos ismernünk az egrep parancsot is, ahol logikai kapcsolattal összefuzhetjük a mintákat, ezt jelöli a '|' karakter, tehetünk a minta után '+' jelet, ha a minta egy vagy többszöri elofordulását keressük, illetve '?' jelet, ha a minta legfeljebb egyszeri elofordulását figyeljük. $ egrep '^main|^\/\*+Ez a foprogram!? \*+\/' *.c

A fenti minta beszédesen úgy hangzik, hogy keressük azt a .c kiterjesztésu állományt, amely-ben vagy a main függvény van, vagy egy komment sorban, esetleg csillagok közé zárva, az "Ez a foprogram" szöveget találja, úgy, hogy a végén vagy van, vagy nincs felkiáltójel.

Az egrep-nél lehetoségünk van arra, hogy a mintát egy állományból vegyük. Az ember nyil-ván akkor használja ezt a lehetoséget, ha bonyolult mintát kell gyakran alkalmazni. $ cat pattern [A-Z].*[\.!\?]$ $ egrep -f pattern szoveg

A példánkban a szoveg nevu állományból azokat a sorokat választjuk ki, amelyek (nagy való-színuséggel, mert hisz' tulajdonnévvel is kezdodhet egy sor) legalább egy teljes mondatot tar-talmaznak (tehát nagybetuvel kezdodnek és mondatzáró írásjelre végzodnek).

Az fgrep (fixed grep) parancs esetében a minta csak karakterlánc lehet (nem reguláris kifejezés!!!) A grep család tagjai a visszatérési értéket 0-ra állítják, ha nem találtak illeszkedést, 1-re, ha igen, és 2-re, ha akadályoztatva voltak a parancs végrehajtásában. Míg a grep parancs sorokat választ ki az állományból, addig a cut paranccsal oszlopokat le-het „kiszabni” belole. Az oszlopokat kétféleképp értelmezi a parancs. Az elso, egyszerubb esetben, karakterpozíció vagy karakterpozíciókkal határolt mezo formájában adjuk meg a ki-vágandó oszlopot, mint a következo példában: $cut -c1,3-5 semmi **** E se **** ama krte rpa rtek

Page 139: unix kézkönyv

9. fejezet Segédprogramok

141

ama mgyo ama brac krte mgyo nran

A másik lehetoségünk, hogyha nem a karakterpozíció szerint, hanem mezoelválasztó karakte-rek pozíciója szerint meghatározott oszlopokat, ebben az értelemben mezoket választunk ki a sorokból. A mezoelválasztó karaktert a -d opció után írjuk. $cut -f4,5 -d: /etc/passwd

A fenti példában a /etc/passwd állományból a csoportazonosítót és a teljes nevet tartalmazó mezoket választottuk ki. Vigyázzunk arra, hogy a cut nem tud megbírkózni a hagyományos unixos szóelválasztás (egy vagy több szóköz vagy tabulátor) fogalmával, mivel egy és csakis egy elválasztó karakter határolhatja el a feldolgozandó mezoket, s ha több egymás utáni szóközt talál, minden egyes szóköz után egy üres mezot tételez fel. Például ha mintafajlunk az alábbi: abc 123 456 def 23 456 ghi 3 456

akkor a cut -d’ ‘ -f 2 <mintafajl parancs hatására nem az ösztönösen várt 123 23 3

lesz a kapott eredmény, hanem 123

miután az egynél több szóköz üres mezoket jelentett a cut számára. A uniq program arra a célra szolgál, hogy az egymás után következo azonos sorokat kiszurje az inputból, s minden sort csak egyszer írjon a kimenetre. E tulajdonsága miatt gyakran szok-ták a sort, illetve a grep elott vagy után, e két program bemenetének vagy kimenetének szu-résére használni. $ sort semmi | uniq -c 1 ***** 1 ***** ***** 1 Ez semmi 3 alma 1 barack 2 korte 2 mogyoro 1 narancs 1 repa 1 retek $

Page 140: unix kézkönyv

UNIX felhasználói ismeretek

142

Tovább is ragozhatjuk a kérdést, ha meg akarjuk nézni, hogy melyik sor fordult elo a leg-gyakrabban. $ sort semmi | uniq -c| sort -n | tail -1 3 alma $

A példában újdonságként megjelent a tail parancs, amely az állomány végébol ad vissza soro-kat.

A tail paranccsal nagyméretu állományokban tudunk mozogni, így elsosorban arra használ-juk, hogy egy hosszú állomány végére pozícionáljunk, s onnan írassunk ki egy darabot. Az alábbi példában a /etc/passwd állomány utolsó 50 karakterét íratjuk ki: $ tail -50c /etc/passwd pix abraham:x:108:1:abraham:/usr/abraham:/bin/ksh $

Bizonyos Unix implementációkban a tail parancs csak 20 kB mélységig képes visszamenni a listázott fájlban. Ha ennél többet szeretnénk kilistázni (például logfájlokat kurtítanánk, de nem elég a 20 kB méret) akkor célszeru a fájl elejétol elindulni, s a head paranccsal pozicionálni az általunk kívánt részig.

Állományok összehasonlítása Különbözo szempontból hasonlítanak össze állományokat a comm, a cmp és a diff paran-csok. A comm három oszlopban írja ki két állomány összehasonlításának eredményét. Az elso osz-lopban csak azok a sorok szerepelnek, amelyek csak az elso, a másodikban azok amelyek csak a második, végül a harmadikban azok amelyek mindkét állományban elofordulnak. Ha az egyik állománynév helyén — jelet írunk, akkor a standard inputról várja az egyik összeha-sonlítandó tartalmat. Így interaktívan használható arra is, hogy megnézzük bizonyos sorok meglétét egy állományban. Egyik fájlunk legyen a pár oldallal odébb definiált semmi, s valami egy másik állomány. $ cat valami ***** Ez valami ***** ***** alma korte repa retek mogyoro narancs

Page 141: unix kézkönyv

9. fejezet Segédprogramok

143

Ha a comm paranccsal összehasonlítjuk semmit és valamit az eredmény csak egy közös sort fog mutatni, az elso, csupa csillagból álló sort. Értelmesen csak akkor tud a comm dolgozni, ha az állományok sorai „ábécé”-be rendezettek. A cmp parancs két állomány összehasonlítására szolgál, itt is szerepelhet az egyik állomány helyén - karakter, a standard inputot jelölve. Alapértelmezés szerint azonos állományok ese-tén nem ír ki semmit, eltérés esetén jelzi az eltérés sor- és bájtszámát. Felismeri, ha az egyik állomány a másik kezdeti része. Nagy elonye, hogy a diff paranccsal ellentétben bináris fájlok összehasonlítására is alkalmas. A diff program kilistázza a két összehasonlított állomány eltéro részeit, ----- karakterekkel je-lölve az egyes állományokban eltéro részeket. A diff igazi használhatósága azonban abban rej-lik, hogy nemcsak azt mondja meg, hogy a két állomány hol tér el egymástól, hanem azt is, hogy hogyan lehet az egyikbol a másikat rekonstruálni. A produkált kimenetben olyan sorok is szere-pelnek, amelyek az ed editor számára értelmezheto parancsok, és azt mondják meg, hogy mely ed parancsokkal lehet az egyik állományt a másikká konvertálni. Az ed parancssorok után egymástól vonallal elválasztva jönnek az egyik illetve a másik állomány-ban érintett sorok. A -e opció hatására csak a megfelelo ed parancssorok generálódnak, így lehe-toség nyílik egyfajta primitív verziókövetési rendszer létrehozására. Vegyük példának azt az esetet, amikor egy állományt módosítva létrehozunk egy másik állományt, de ahelyett, hogy mindkettot elmentenénk, csak az elsot, illetve a két változat különbségét mentjük el. Van még két állományunk a vers1 és vers2. $ cat vers1 Elaludtak a fak a levelek libegnek az almok tudnak varni az almok nem sietnek $ cat vers2 Elaludtak a fak a levelek libegnek az almok tudnak varni az almok nem sietnek Tudjal te is almokra varni, ahogy ok tudnak varni rad Az eber csak igy nem csalja meg magat.

A ketto különbsége: $ diff vers1 vers2 4a5,7 > Tudjal te is almokra varni, > ahogy ok tudnak varni rad > Az eber csak igy nem csalja meg magat. $

Készítsük el a delta javítóállományt. $ diff -e vers1 vers2 | tee delta 4a Tudjal te is almokra varni, ahogy ok tudnak varni rad

Page 142: unix kézkönyv

UNIX felhasználói ismeretek

144

Az eber csak igy nem csalja meg magat. . $

A '4a5,7' ed parancs azt jelzi, hogy az eredeti fájl negyedik sora után kell beszúrni a másik fájl 5–7 sorait.

Ha most az alábbi parancssorozatot gépeljük be, akkor az eredeti szöveg és a különbség alap-ján visszakaphatjuk a frissebb változatot: $ (cat delta; echo '1,$p') | ed — vers1 Elaludtak a fak a levelek libegnek az almok tudnak varni az almok nem sietnek Tudjal te is almokra varni, ahogy ok tudnak varni rad Az eber csak igy nem csalja meg magat. $

Mielott továbbmennénk, tegyünk két megjegyzést az elobbi parancssorhoz. A pipe-olt utasítá-sok ütemezését nem a shell, hanem a kernel végzi. Az echo parancs argumentuma itt az ed editor munkájának befejezését vezérli, az 1,$ az elsotol az utolsó sorig jelöli ki a tartományt, a p pedig a print parancs.

A példában felhasználtuk a tee parancsot is. Ez a parancs „megcsapolja” az outputot, így a természetes outputon kívül keletkezik a delta állomány ugyanazzal a tartalommal, mint amit a képernyon látunk.

Ugyanezen az elven muködik egyébként a UNIX SCCS (Source Code Control System) for-rásköveto rendszere is.

A cmp és a diff egyaránt állítják a kimeneti változók értékét, mégpedig egységesen az alábbi szempont szerint: 0-ra, ha a két állomány egyezik, 1-re ha különböznek, és 2-re, ha akadály van a parancs végrehajtásában.

Nem életbevágóan fontos parancs, inkább csak a UNIX-ról alkotott kép kiszínezésére említ-jük meg a join parancsot, ami két állomány soraiból fuzi össze az outputját, úgy, hogy az összefuzés kulcsául választott mezok alapján az azonos tartalmú mezoket egyesíti. A helyes muködés feltétele, hogy a kulcsnak választott mezo alapján az állomány lexikografikusan ren-dezett legyen. Megint csak példával segítjük a megértést: $sort -n -t: +3 -4 /etc/passwd >pswd $sort -n -t: +2 -3 /etc/group >grp $join -t: -j1 4 -j2 3 -o1.1 1.4 2.1 pswd grp

Az elso két sor értelme, hogy rendezze a nevezett állományok sorait, az elso esetben a harma-dik és negyedik, a második esetben a második és harmadik mezo alapján. (A mezohatározó karakter a kettospont.) A harmadik sor azt mondja, hogy még mindig a kettospont mezoelvá-lasztóval dolgozva, az elsoként megadott állomány negyedik és a másodikként megadott állo-mány harmadik mezeje szerint ( -j1 4 -j2 3) párosítva a sorokat az output sorait az elso állo-mány elso és negyedik valamint a második állomány elso mezeibol tegye össze ( -o1.1 1.4

Page 143: unix kézkönyv

9. fejezet Segédprogramok

145

2.1). Egyszerubben szólva, az output sorai rendre a bejelentkezési névbol, a csoport azonosí-tóból és a csoport névbol fognak állni.

Állománylistázó („dump”) parancsok Az alábbiakban ismertetendo UNIX parancsok közös vonása az, hogy állományok tartalmá-nak különbözo szempontok alapján történo megjelenítésére szolgálnak elsosorban. Az od (octal dump), a dd (decimal vagy disk dump) egyaránt erre a célra jött létre. Mivel azonban kérhetjük a listázást akár karakteres formában is, ezért elkövethetjük azt a hibát, hogy egy bi-náris állományt akarunk karakteresen a képernyore küldeni, ami zurzavart okozhat. (Hasonló-an, ahhoz, mintha a cat paranccsal akarnánk egy bináris állományt elolvasni.) Amikor egy ál-lomány típusáról nem tudunk biztosat, az ilyen galibákat megelozhetjük, a már említett file parancs használatával. $ file semmi semmi: ascii text $

Az od parancs, azzal, hogy megfelelo opció választással a nem nyomtatható karakterek kódja-it is megjeleníti, alkalmas apróbb trükkökre. Így például kiolvashatjuk vele a katalógust, illet-ve a katalógusból azt, ha egy hiba folytán egy állománynévbe nem látható karakter kevere-dett. $ od -c semmi 0000000 * * * * * \n E z s e m m i \n * 0000020 * * * * * * * * * \n a l m a \n 0000040 k o r t e \n r e p a \n r e t e k 0000060 \n a l m a \n m o g y o r o \n a l 0000100 m a \n b a r a c k \n k o r t e \n 0000120 m o g y o r o \n n a r a n c s \n 0000140 $

A dd parancs szintaktikájára külön fel kell hívni a figyelmet, ugyanis ellentétben a legtöbb paranccsal, itt az opciókat az opció = érték formában adjuk meg, úgy mint egy shell-változó értékadásánál. A dd parancs elsosorban különféle konverziós opciói miatt használatos. Például a következo parancs a kisbetuket alakítja naggyá. $dd if=valami conv=ucase **** EZ VALAMI ***** ***** ALMA KORTE REPA RETEK MOGYORO

Page 144: unix kézkönyv

UNIX felhasználói ismeretek

146

NARANCS $

Az alábbi parancs a beolvasott állományt fordított bájtsorrenddel írja ki (figyeljük meg, hogy a dd a UNIX állománykoncepciójának megfeleloen az újsor karaktert is ugyanúgy kezeli, mint a közönséges karaktereket, tehát azok is résztvesznek a bájtcserében): $ dd if=semmi conv=swab of=semmi1; pr -t -m semmi semmi1 0+1 records in 0+1 records out ***** **** Ez semmi *zEs meim* ***** ***** ***** ****a alma ml korte aoktr repa eerapr retek tekea alma ml mogyoro aomygro alma olaamb barack raca korte koktr mogyoro eomygro narancs oanarcn s $

Az eredményt küldhettük volna közvetlenül a képernyore is, ha nem határozunk meg output fájlt. Ezt azért nem tettük, mert így a pr parancs -m opcióját használva az eredeti és a fordí-tott bájtsorrendu állományt egyszerre tudtuk megjeleníteni.

Karakterkonverzió A karakterkonverziós programok közül a leghasznosabb és legismertebb a tr (translate). Ez a parancs a standard bemenetrol a standard kimenetre dolgozik, miközben az input egyes karakte-reit kicseréli. A cseréhez két „táblázatot” használ, amelyeket string (karakterlánc) formában a parancs argumentumaiként kell megadni. A cserének az a stratégiája, hogyha a beolvasott szö-vegben talál egy olyan karaktert, amelyik a sorrendben elsoként megadott stringben található, akkor azt a második string azonos pozíciójú karakterével helyettesíti. Az alábbi parancs minden a betut x, b betut y és c betut z beture cserél: tr “abc” “xyz” < file1

Az alábbi parancs a vers1-ben szereplo szavakat írja ki úgy, hogy minden szó külön-külön sorba kerüljön: $ tr -cs "[A-Z][a-z]" "[\012*]" <vers1 Elaludtak a

Page 145: unix kézkönyv

9. fejezet Segédprogramok

147

fak a levelek libegnek az almok tudnak varni az almok nem sietnek $

A példa megértéséhez ismernünk kell a tr parancs két felhasznált opcióját. A -c opció hatására a cserére szánt karakterek helyett az ASCII karakterkészlet minden olyan karakterét értelmezi, amit nem soroltunk fel, és azokat cseréli ki a második karakterlánc megfelelo elemére. Tehát ebben az esetben mindent ami nem kis- vagy nagybetu, a példában szóköz és sorvége fordul elo, kicseréli a \012 karakterre, azaz a sorvégére. A -s opció hatására a csere miatt egymás mellé került több azonos karakter helyett csak egyet ír ki. Tehát ebben az esetben, a forrás szövegben lévo szóköz és sorvége páros miatt keletkezo két sorvégébol csinál egyet. A cserére szánt karakterláncban a csillag karakter arra szolgál, hogy a megelozo karaktert, itt a sorvégét, pont annyi darabbá sokszorozza, ahány karakter a cserére szánt karakterláncban van, így a parancs minden kicserélendo karakterhez talál párt.

Még egyszer felhívjuk a figyelmet arra, hogy a tr a standard ki- és bemenetet használja, fájlparamétert nem fogad el.

Állománykeresés Gyakran eloforduló feladat, hogy bizonyos jellemzoik alapján állományokat kell elokeresni az állományrendszerbol. Erre a célra a find program szolgál. Hívási módja a következo: find pathname_list expr

A find parancs rekurzív módon végighalad a pathname_list-tel megadott elérési nevektol kezdve az állományrendszeren, megkeresi azokat az állományokat, amelyekre igaz a paramé-terként megadott expr logikai feltételsorozat. Az expr-ben több feltételt sorolhatunk fel, amelyek egymással logikai AND kapcsolatban vannak, ha másképp nem rendelkezünk. A feltételek nagyobb része egy-egy állományjellemzore kérdez, mint a méret (-size) vagy a kor (-newer)..., de számtalan más feltétel áll rendelkezésre (lásd minimanuál). Amennyiben a fel-tételek közt a -print feltétel is szerepel, akkor a standard outputra írja a feltételekhez illeszke-donek talált állományok nevét, illetve, ha a -exec cmd feltétel is szerepel, akkor végrehajtja rajtuk a cmd UNIX parancsot.

Page 146: unix kézkönyv

UNIX felhasználói ismeretek

148

Az alábbi parancs az aktuális katalógusban lévo állományokat listázza ki (magát a katalógust és a szülo katalógust is): $ find . -print . ./.profile ./.lastlogin ./.sh_history ./valami ./vers1 ./nu ./nme ./semmi ./akarmi ./vers2 ./ascii.c ./logsh ./temp ./semmi1 ./delta $

Az alábbi parancs törli mindazokat az a.out nevu (végrehajtható bináris) állományokat, illetve mindazokat a .o kiterjesztésu (object) állományokat amelyekhez egy hétnél régebben nem fért hozzá senki (ne feledkezzünk meg a zárójelek levédésérol): $ find /\( -name a.out -o -name "*.o" \) -atime +7 -exec rm {} \; $

Az -exec opció hatására végrehajtott törlésnél a megtalált állomány nevére a kapcsos zárójel-párral hivatkozhatunk. A pontosvesszot azért kell kiírnunk, mert az exec opcióval megadott cmd parancs (példánkban az rm parancs) végét jelzi, s elvileg megadhatunk utána további opciókat. (Vigyázzunk arra is, hogy a jobboldali kapcsos zárójel és a backslash karakter között szóköznek kell lennie!)

Adatbeviteli parancsok Mint már arról esett szó, egy létezo shell változónak egyszeru értékadással lehet értéket adni. Egy másik lehetoségünk az értékadásra a read parancs, ami a standard inputról olvas be egy sort, és a paraméterében felsorolt változóknak adja a kapott értéket. $ read a b c; echo $a; echo $b; echo $c Kezdetben volt az aranykor Kezdetben volt

Page 147: unix kézkönyv

9. fejezet Segédprogramok

149

az aranykor $

Látható, hogy az elso (a) változóba az elso határoló szóközig, a második (b) változóba a má-sodik szóközig pakolja az értéket, és ha elfogynak a változók, akkor az utolsó (c) változóba az input sor maradékát teszi.

Egyes UNIX applikációkban létezik egy line parancs is, ami sorvégéig veszi a standard input-ról jövo karaktereket, és visszaírja oket a standard kimenetre; ezt is felhasználhatjuk arra, hogy a beolvasott sort változóba tegyük.

Aritmetikai kifejezéseket kezelo parancsok A UNIX szemléletmódja a legtöbbször nem támogatja az aritmetikai kifejezések használatát. Ez csak ritkán okoz problémát a használatban, leggyakrabban a következo fejezetben ismerte-tendo shellscript-ek írásakor van rájuk szükség. Két fontos olyan parancs van, ami elfogad idegen aritmetikát: a test és az expr. A test parancs arra szolgál, hogy egy objektumról (fájlról vagy karaktersorozatról) megtudjuk, hogy egy adott tulajdonsággal bír-e. Így például tesztelhetünk egy állományt aszerint, hogy létezik-e, végrehajtható-e, stb. Hasonlóképpen vizsgálhatjuk egy karaktersorozat tulajdonságait (be van-e állítva, mekkora a hossza, azonos-e egy másikkal, stb.) (Teljesebb opcióleírások megint csak a Minimanuálban szerepelnek.)

Page 148: unix kézkönyv

UNIX felhasználói ismeretek

150

$ test -w /etc/group; echo $? 1 $ a=2; test $a -eq 2; echo $? 0 $ test "$a" = "02"; echo $? 1 $

A fenti példa, alapveto butuskasága ellenére megmutatja a test parancs három arcát. Az elso esetben a /etc/group állományról szeretnénk megtudni, hogy létezik-e és írható-e, precízebben, írható-e a mi számunkra, mivel a parancs a hívó szempontjából vizsgálja az en-gedélyeket. A válasz nem, ezt mutatja az exit változó ($?) nullától különbözo értéke. A második esetben, miután értéket adtunk az a változónak, azt teszteltük, hogy annak értéke azonos-e kettovel. Mivel a test parancs -eq opcióját használtuk, az egyébként alapértelmezésben stringként kezelt változót a Unix numerikus értékként kezelte, s numerikus összehasonlítást végzett. Harmadik példánkban viszont az = jel azt jelezte a Unix shell számára, hogy stringösszehasonlítást kell végrehajtania, s így a változót stringként kezelve hasonlította a '02' karakterekhez, amelyek így valóban nem egyeznek egymással.

Az expr parancs három, egymástól eléggé eltéro feladatra alkalmazható. Az elso, és leggyakrabban használt funkciója, hogy az átadott argumentumlistát logikai vagy (egész) arit-metikai kifejezésként értékeli ki. A legegyszerubb példa ennek szemléltetésére talán az aláb-bi: $ expr 16 + 3 19 $ a=5; expr $a + 1 6 $

Az összeadáson kívül természetesen ismeri a kivonás, (-) a szorzás, (\*) az osztás (/) és a ma-radék képzés (%) muveleteket. Érdemes felfigyelni a parancs szintaktikájára, mert apróság-ból eredo nagy bosszúságtól óvhatjuk meg magunkat. Részint vegyük észre, hogy a kifejezés belsejében lévo muveleti jelet szóközök veszik körül, másrészt a shell számára értelmezheto karaktert mindig el kell fednünk a shell elol egy backslash karakterrel.

Összekapcsolhatunk kifejezéseket logikai ÉS (&) és VAGY (|) jelekkel, és használhatunk relációs operátorokat is. $ a=1; expr $a >= 0 0 $

Az expr parancs következo két funkciója stringek illeszkedésének vizsgálatára szolgál. Az

expr var : pattern

megadás esetén az expr a var argumentumra próbálja meg illeszteni a pattern argumentumot, mint mintát, s az illeszkedo karakterek számát fogja kiírni. A mintaként használt második argumentum tetszoleges reguláris kifejezés lehet. Nézzük meg ezt két példán!

Page 149: unix kézkönyv

9. fejezet Segédprogramok

151

Az elso esetben azt vizsgáljuk, hogy a munkakatalógusunk nevére hogyan illeszkedik az alapkatalógusunk neve, mint minta: $ pwd; echo $HOME /usr/users /usr/users/demo $ expr `pwd` : $HOME 0 $

Az expr 0 értéket adott vissza, mert maga a minta hosszabb, mint a szöveg. Ha viszont fordítva, a munkakatalógusunk illeszkedését vizsgáljuk az alapkatalógusra... $ expr $HOME : `pwd` 10 $

Ugyanennek a stringillesztéses funkciónak egy módosítása, hogy nem az illeszkedo karakterek számát íratjuk ki, hanem az illeszkedo stringrészletet. Ehhez az kell, hogy a pattern mintában a kiiratandó szövegrészt backslash karakterrel levédett kerek zárójelek közé írjuk. Az alábbi példában a basename parancs muködését modellezzük: a megadott fájlnévrol leszedjük az esetleges katalógusneveket, és csak a fájlnevet hagyjuk meg: $ expr /usr/archive/src12.c : '.*/\(.*\)' src12.c $

(E megoldás a reguláris kifejezések illesztésének azon sajátosságát használja ki, hogy az illeszto algoritmus (balról jobbra haladva) mindig a leheto leghosszabb mintát próbálja az adott stringre illeszteni. Ennek pedig az a következménye, hogy a fenti példánkban az illeszto algoritmus a '.*/' mintát a fájlnévben szereplo legjobboldalibb '/' karakterig húzza ki, a zárójelek között megadott '.*' rovására - jelen esetben pedig éppen ez az, amit akartunk.)

Kommunikációs parancsok A UNIX már korai megjelenésekor is támogatta, hogy különbözo terminálokon, esetleg nem is egyidejuleg dolgozó felhasználók egymással elektronikusan kapcsolatot tudjanak teremte-ni. Egyik terminálról a másikra „írhatunk” interaktivan a write paranccsal. $write janos Hogy allsz a munkaval? Majdnem kesz vagyok Tovabbi jo munkat! Szia Jutka ^d $

Közben János képernyojén ez látható:

Page 150: unix kézkönyv

UNIX felhasználói ismeretek

152

$ls file1 Message from lj tty2 Hogy allsz a munkaval? Majdnem kesz vagyok Tovabbi jo munkat! Szia Jutka EOT file2 file3

Mint látjuk, a hívó a hívottat a login nevével, vagy a termináljának azonosítójával címzi meg, és utána azonnal írhatja az üzeneteit, addig amíg egy interupttal, vagy fájl-vége jellel be nem fejezi. A hívottnál a terminál egy esetleges csengetéssel és a Message from... üzenettel jelent-kezik és az elso üzenet után egy write paranccsal válaszolni lehet. Természetesen az üzenetek csak a képernyon jelennek meg, nem rondítanak bele az esetleg épp feldolgozás alatt lévo ál-lományba. Ha a hívott ki szeretné zárni a lehetoséget, hogy ot megszólítsák, akkor egy mesg n paranccsal bezárja saját ablakát, amit késobb egy mesg y paranccsal újból kinyithat.

A write-hoz hasonló eszköz a talk is, ahol interaktívan levelezhetünk a címzettel, a két részre osztott képernyo egyik felén a mi általunk, a másik felén a partnerünk által begépelt szöveg látható.

Végül a rendszeradminisztrátori jogokkal bíró felhasználónak rendelkezésére áll a wall (azaz write all) parancs, amivel egyszerre tud üzenni az összes bejelentkezett felhasználónak (broadcast message).

Nem interaktív kommunikációra szolgál a mail, ami az egymástól távoli gépeken lévo felhasználók legalapvetobb levelezési eszköze. $mail janos Sietnunk kell mert lekoroznek . $

János képernyojén egy ido múlva (vagy ha éppen nincs bejelentkezve, a következo bejelentkezés után a „You have mail”, vagy valami hasonló szöveg jelenik meg. $ echo alma alma You have mail $ mail From lj Wed Sep 1 16:40 EDT 1993 Sietnunk kell mert lekoroznek ?d q $

Page 151: unix kézkönyv

9. fejezet Segédprogramok

153

A mail után írt cím mondja meg, hogy kinek szánjuk a levelet. A címzett lehet a mi gépünk valamelyik felhasználója (akár saját magunk is), vagy egy távoli géprol valaki; ilyenkor rendszerint a user @ host formában adjuk meg a címet, ahol user a távoli felhasználó bejelentkezési neve, host pedig a távoli gép neve. Magát az üzenetet a parancs utáni sorba kezdjük el írni, és egy fájl vége, azaz CTRL-D jellel, vagy az üres sorba írt ponttal zárjuk le. Bejelentkezéskor, illetve a MAILCHECK változóban megszabott idonként a rendszer meg-nézi, hogy van-e valami a felhasználó postaládájában, és ha igen, akkor egy „you have mail” üzenetet küld a terminálra. Amennyiben a mail parancsot címzett nélkül írjuk le, akkor a kép-ernyore üríti a postaláda tartalmát, és egy ?-el várja, hogy rendelkezzünk róla. Egybetus pa-rancsokkal, például d (törlés), q (kilépés) stb. rendelkezhetünk a továbbiakról.

Egyes UNIX verziókban létezik egy mailx program is, ami valamivel jobb felhasználási felületet nyújt; megint más rendszerben ezt a mailx programot lehet mail néven meghívni...

Egyéb hasznos UNIX utility-k Az alábbiakban csak megemlítünk néhány olyan UNIX segédprogramot, amelyek használata hasznos lehet. Ismét hangoztatni kell a Reference Manual kötetek permutált indexének, illetve a man -k parancs használatának fontosságát, mert adott funkciót ellátó programokat kizárólag innen kísérelhetünk meg „felfedezni”. bc tetszoleges pontosságú aritmetikai nyelv calendar emlékezteto rendszer cal naptár nyomtatása dc asztali kalkulátor news kiírja a rendszerrel kapcsolatos friss híreket nl besorszámozza a sorokat pack, pcat, unpack állományokat tömörít, visszafejt, illetve tömörített állományokat listáz paste állományok sorait fésüli össze size tárgy kódú állományok méretét írja vissza split feldarabolja a nagyméretu állományokat

Page 152: unix kézkönyv

154

10. FEJEZET

SHELL PROGRAMOZÁS

Az elozoek során egyfelol megismerkedtünk a shell alapveto szolgáltatásaival, másfelol átte-kintést nyerhettünk a leggyakrabban használatos UNIX programokról. Az alábbiakban a UNIX shell bonyolultabb szolgáltatásairól lesz szó, s ezek használatát példaprogramokon il-lusztráljuk. Végsosorban arról lesz szó, hogy vezérlési szerkezetek segítségével hogyan tu-dunk shell parancsokból programokat, a már sokat emlegetett shellscript-eket eloállítani, ami-ket a parancsokhoz hasonlóan tudunk aztán használni. A nagyobb példák bemutatása elott ezért az eszközkészletet: vezérlési struktúrákat, paraméteradást, az eredmény megorzését stb. ismertetjük.

A shell komplex átirányítási funkciói Találkoztunk már a be- és kimenetek átirányításának lehetoségével. Az ott tárgyaltakon kívül más átirányítási lehetoségeket is biztosít a shell. Az eddig ismert átirányítási mechanizmusok megadhatóak úgy is, hogy az átirányítás jele elé egy számot írunk, például 2> file. Ez a szám az úgynevezett állományleíró (file descriptor); amely egyértelmuen azonosítja a UNIX szá-mára a megnyitott állományokat, illetve a bemeneteket és a kimeneteket. A szokásos kiosztás szerint 0 a bemeneti (standard input), 1 a kimeneti (standard output), míg 2 a hiba (standard error) csatorna leírója, a megnyitott egyéb állományok ennél nagyobb számokat kapnak, de ezt példáinkban nem használjuk ki. A fenti példa tehát azt jelenti, hogy a hiba csatornát irá-nyítottuk át a file állományba. Egy állományra illetve be/kimeneti csatornára az állományleíró segítségével is hivatkozha-tunk, ebben az esetben az állományleírót egy & karakter kell hogy megelozze, például &1 a standard outputra hivatkozik. Az alábbi példában a sort program standard error csatornáját a standard outputra küldjük, amit átirányítunk a valami állományba. Amikor rossz opciót adunk meg, látható, hogy a hibacsatorna tartalma is a valami állományba kerül: (az átirányítás nél-kül a terminálra kerülne) $ sort -X semmi >valami 2>&1 $ cat valami sort: invalid use of command line options $

Beágyazott input (here documents)

Page 153: unix kézkönyv

10. fejezet Shell programozás

155

Az átirányításoknak egy speciális fajtája az úgynevezett here documents, amit jobb híján beá-gyazott input néven fogunk emlegetni. E különleges mechanizmus megadását a következo példán szemléltetjük: $ ed semmi <<vege 1,\$p 1,\$s/\^/\* / 1,\$p w q vege 96 ***** Ez semmi ***** ***** alma korte repa retek alma mogyoro alma barack korte mogyoro narancs * ***** 124 $

A fenti példában a << jel azt jelzi, hogy a behívott program, jelen esetben az ed, inputját a shell-tol veszi, mégpedig addig, amíg egy olyan sorral nem találkozik, amelyik a sor elején a << jel után szerepelt mintát (esetünkben a vege szócskát), és csak azt tartalmazza. Ez a minta természetesen tetszoleges lehet. A fenti példában a semmi nevu állományt editáltuk meg úgy, hogy eloször az egészet kiírattuk, majd az egész állományban a sorkezdetekre beillesztettünk egy csillag és egy szóköz karaktert. $ cat semmi * ***** * Ez semmi * ***** ***** * alma * korte * repa * retek * alma

Page 154: unix kézkönyv

UNIX felhasználói ismeretek

156

* mogyoro * alma * barack * korte * mogyoro * narancs $

E módszer terminálról közvetlenül begépelt shell parancsok esetében is használható, de igazi jelentosége shellscript-ekben van, ahol elore megírt parancsszekvenciákat tudunk átadni olyan programoknak, amelyek bemenetüket a standard inputról veszik, s valamilyen ok miatt nincs lehetoség a standard input átirányítására.

Vezérlési szerkezetek a shell-ben Már említettük, hogy a shell egy teljes programozási nyelv, ennek megfeleloen viszonylag bonyolult vezérlési szerkezeteket, feltételes elágazásokat, ciklusokat és változókat is definiál. A változókról már esett szó a 4. fejezetben, most a vezérlési szerkezetekkel ismerkedünk meg. Elsoként azonban emlékeztetjük az olvasót az exit változóra, arra az egész számra, amelyet a UNIX parancsok lefutásukkor beállítanak1. A UNIX manuálokban az egyes progra-moknál mindig szerepel a lehetséges visszatérési értékek felsorolása. Valójában most fogjuk használni ezt a változót, mivel a parancsok visszatérési értékét használják az alább ismertetendo shell vezérlési szerkezetek is. Maguk a vezérlési szerkezetek, szintaktikájuk és szemantikájuk egyaránt a C nyelv hasonló szerkezeteire emlékeztetnek, ami természetesen nem véletlen.

Elágazások Az if elágazási mechanizmus

Az alapveto elágazás szerkezet a UNIX shell-ben az if-szerkezet, amelyben, a más program-nyelvekben szokott módon, egy feltétel teljesüléséhez van kötve, hogy mi legyen a soronkövetkezo végrehajtandó utasítás. Az if-szerkezet a következoképpen néz ki: if command_list1 then command_list2 elif-part fi

1 Ha egy parancs nem állítja a visszatérési változó értéket, a legutolsó beállítás marad érvényben — erre vigyázzunk az exit változó lekérdezésekor!

Page 155: unix kézkönyv

10. fejezet Shell programozás

157

ahol elif-part a következok valamelyike lehet: elif command_list then command_list elif-part

vagy else command_list

Az if-ág akkor hajtódik végre, ha az if kulcsszó után megadott command_list1 logikai értéke igaz, azaz a command_list1 visszatérési értéke nulla. A command_list1 több parancsból is áll-hat (ezeket a már ismert pontosvesszovel, illetve a kerek zárójelekkel, vagy éppen a pipe ré-vén csoportosíthatjuk). Több parancs esetén az utolsó parancs visszatérési kódja számít a command_list1 kiértékelésekor. Mint látható, az else-part el is maradhat, de több elágazási feltételt is tartalmazhat. Vigyázni kell arra, hogy a feltételeket a fentiek szerint tördeljük so-rokba, vagy ha egy sorba írjuk oket, akkor pontosvesszovel válasszuk oket el egymástól, mert ebbol ismeri fel, hogy az adott helyen kulcsszót kell keresnie, és nem az utolsó utasítás egy argumentumáról van szó.

(Ha elegánsabban akarjuk megoldani a kiíratást, s magát a dátumot nem akarjuk látni, átirányíthatjuk a grep kimenetét a "szemétkosárba", a /dev/null fájlba: $ if date | grep Apr >/dev/null; then echo Tavasz van!; fi Tavasz van! $

(A /dev/null egy különleges fájl-jellegu periféria: ha errol olvasunk, mindig az EOF (fájl vége) karaktert kapjuk, ha pedig írunk rá, az eredmény sehol nem jelenik meg - épp ezért szokták "szemétkosárként" használni, a látni nem kívánt kimenet átirányítására.)

A case elágazási mechanizmus

A case utasítás a többszörös elágazások megvalósításának legkézenfekvobb eszköze. Formája a következo: case word in case-part esac

ahol case-part a következo lehet: pattern) command_list;;

Az már természetes, hogy a command_list több, egymással akár kapcsolatban levo utasítás is lehet. Fontos viszont, hogy az utasítássort két darab kettospont zárja.

A case szerkezet a következoképpen muködik: a shell megkeresi azt az elso pattern mintát, amelyik illeszkedik a word szó aktuális értékéhez, s végrehajtja azt a command-list parancsot vagy parancssorozatot, amelyik ehhez az illeszkedo mintához tartozik. A minta megadásakor az állománynév kifejtésénél tárgyalt metakarakterek használhatóak. Ha word aktuális értéke egyik mintára sem illeszkedik, akkor semelyik command_list sem hajtódik végre. Fontos hangsúlyozni, hogy az elsonek talált illeszkedo mintához tartozó parancsokat hajtja végre a

Page 156: unix kézkönyv

UNIX felhasználói ismeretek

158

shell, ezért a speciálistól az egyre általánosabb minták felé haladva célszeru megadni a mintá-kat. A '|' karakter használatával több mintát is megadhatunk, ha ezek bármelyikére illeszkedik word, a parancság végrehajtódik.

Ciklusok A for ciklus

A for ciklusutasítás a következoképpen néz ki: for name in word_list do command-list done

A word_list egy karakterláncokból álló felsorolás. A felsorolt elemeket a szóköz általános mezoelválasztó tagolja.

A for ciklus végrehajtásakor a shell a name változónak sorra a word_list felsorolásban sze-replo értékeket adja, s ezzel az értékkel hajtja végre a command_list parancssorozatot. Az alábbi példában ötször egymásután kiírjuk az idot, három másodperces idoközönként, s meg-adjuk azt is, hogy hányadik kiíratás zajlik: $ for i in 1 2 3 4 5; do echo $i; date; sleep 3; done 1 Wed Apr 17 20:58:30 MET 1991 2 Wed Apr 17 20:58:34 MET 1991 3 Wed Apr 17 20:58:37 MET 1991 4 Wed Apr 17 20:58:41 MET 1991 5 Wed Apr 17 20:58:44 MET 1991 $

Mint láttuk, a name ciklusváltozónak tetszoleges explicit értéket is megadhatunk, de lehet a word-list egy '*' is. Shellscript-ekben gyakori, hogy a for ciklus a pozicionális paramétereken „megy végig”. Ennek figyelembevételével ha az in word_list rész hiányzik a for ciklus mega-dásakor, akkor a word_list értékét a shell automatikusan $*-nak értelmezi, s az ennek kifejté-sébol adódóan a pozicionális változók értékeit helyettesíti be sorban a ciklusváltozóba.

A while és az until ciklus

A while és az until ciklusok egymáshoz hasonló formája a következo:

Page 157: unix kézkönyv

10. fejezet Shell programozás

159

while command_list1 do command_list2 done until command_list1 do command_list2 done

A while ciklusban a shell végrehajtja command_list1 parancssorozatot, s ha annak visszaa-dott értéke nulla,2 azaz command_list1 logikai értéke igaz, akkor végrehajtja command_list2-t; mindezt addig ismétli, amíg command_list1 logikai értéke nem lesz hamis. Az until ciklus-ban ugyanez történik, csak a feltétel kiértékelése fordított, amíg command_list1 logikai értéke hamis, addig hajtja végre a ciklust. Az alábbi parancsok végtelen ciklusban írják ki az idot (másodpercenként), az elore definiált, igaz logikai értéku true állandót használva:3

2 Több parancs esetén az utolsó beállítás számít. 3 A true és a false ténylegesen belsõ shellparancsok, de a felhasználás szempontjából ez érdektelen. Az exit változót értelemszerûen állítják be.

Page 158: unix kézkönyv

UNIX felhasználói ismeretek

160

$ while true; do date; sleep 1; done Wed Apr 17 20:59:30 MET 1991 Wed Apr 17 20:57:31 MET 1991 Wed Apr 17 20:57:33 MET 1991 Wed Apr 17 20:57:34 MET 1991 ... $

A program futása az aktuális interrupt karakterrel szakítható meg.

Példaprogramok Az alábbiakban néhány shellscript vizsgálatán keresztül illusztráljuk a shell parancs-nyelvének eddig tanult jellemzoit, s azt, hogy hogyan lehet gyorsan meglepoen komplex fela-datok ellátására szolgáló keretprogramokat létrehozni. Javasoljuk az olvasónak, hogy egy-egy program megértése után gondolja el, hogy kedvenc programnyelvén mekkora munkával tudna azonos feladatot ellátó programot írni.

2, 3, 4, ...: többhasábos nyomtatás

Az alábbi szellemes program arra a célra szolgál, hogy a kimenet többhasábos nyomtatását te-gye lehetové: (A program állományneve furcsa módon egy számjegy.) $ cat 2 # 2,3,...: print in multiple columns pr -$0 -t -l1 $* $ who guest vt01 Apr 17 14:23 janos vt02 Apr 17 18:10 $ who | 2 guest vt01 Apr 17 14:2 janos vt02 Apr 17 18:1 $

Példaprogramunk nem csinál egyebet, minthogy a pr parancson engedi keresztül a kimenetet. A -t -l1 opciók révén az egyes lapokra nem kerül rá az állománynév, a dátum és a lapszám, valamint a lapméret egy sorra állítódik, ezek következtében folyamatos lesz a nyomtatás. A -$0 opcióban $0 helyére az állomány neve, jelen esetben 2 fog behelyettesítodni; -2 azonban a pr számára érvényes opció, és azt jelenti, hogy kéthasábos formában kell nyomtatnia a stan-dard outputra. A $* megadás a shell-nek átadott összes pozicionális paramétert jelenti, azaz ha a 2 programot valamilyen opcióval, vagy bármi egyéb paraméterrel hívtuk meg, akkor az átadódik a pr programnak, s az fogja értelmezni oket. Ez a megoldás azt is illusztrálja, hogy hogyan lehet olyan keretprogramokat írni, amelyek csak a számukra fontos opciókat emelik le

Page 159: unix kézkönyv

10. fejezet Shell programozás

161

a paraméterek közül, a többit pedig transzparens módon átadják a feldolgozási sorban utánuk következo programnak. Ezt szemlélteti például a késobbiekben szereplo updt példaprogram, amely csak két opcionális paramétert használ fel maga, a parancssorban szereplo további op-ciókat pedig átadja a programsor utolsó tagjának, az ls programnak, s az állományneveket tar-talmazó eredmény a megfelelo ls opciók szerinti formátumban jelenik meg. Például updt ki-menete az ls parancs kimenetének felel meg, az updt -lrt parancsé viszont az ls -lrt parancs formátumával lesz azonos.

Nyilvánvaló, hogy a fenti program alkalmas tetszoleges hasábszámú nyomtatásra is, ha a kívánt hasábszámnak megfelelo néven tudjuk meghívni, hiszen a hívási név, mint a shell-nek átadott pozicionális paraméter, szolgáltatja a tördelési információt a pr parancs számára. A legegysze-rubb megoldás az lenne, ha a 2 programot a kívánt neveken lemásolnánk. Ez azonban felesleges helypocsékolás lenne, hiszen a UNIX ismeri a linkelés fogalmát, s így a már létezo 2 nevu állo-mányra tetszoleges neveken hivatkozhatunk. A linkelést megcsinálhatjuk úgy is, hogy egymás után végrehajtjuk az ln 2 3; ln 2 4; stb parancsokat. A shell ciklusszerkezetét kihasználva azon-ban kényelmesebben is eljárhatunk: $ for i in 3 4 5 6; do ln 2 $i; done $ ls -l 2 3 4 5 6 -rwxr-xr-x 5 guest other 56 Apr 17 20:15 2 -rwxr-xr-x 5 guest other 56 Apr 17 20:15 3 -rwxr-xr-x 5 guest other 56 Apr 17 20:15 4 -rwxr-xr-x 5 guest other 56 Apr 17 20:15 5 -rwxr-xr-x 5 guest other 56 Apr 17 20:15 6 $

A parancssorban megadott for ciklus az i ciklusváltozónak sorra a 3..6 értékeket adja, s az ln parancs végrehajtásakor 2 az i ciklusváltozóhoz aktuális értékéhez fog linkelodni (precízeb-ben szólva, egy olyan állománynév jön létre a katalógusban, amely név azonos az i ciklusvál-tozó aktuális értékével, vagyis $i-vel).

bell: adott számú terminál hangjelzés

$ cat bell n=${1-1} while [ $n -gt 0 ]; do echo '\07\c' n=`expr $n — 1` sleep 1 done $

A bell program egyet csenget a terminálon, ha argumentum nélkül hívtuk meg, egyébként pe-dig annyit, amekkora az elso argumentuma. A program elso sorában a paraméterek behelyet-tesítésének egy gyakori esetét láthatjuk. A ${var-value} konstrukció a value értéket adja

Page 160: unix kézkönyv

UNIX felhasználói ismeretek

162

vissza,4 ha a változó nincs beállítva. Ily módon tehát default paramétermegadást lehet biztosí-tani a shell változóinak. A konkrét példában az n shell-változó értéke azonos lesz az elso pozicionális paraméterrel, ha olyan létezik; ha viszont pozicionális paraméter nem volt meg-adva, akkor n értéke 1 lesz.

A következo programsorban egy while ciklus kezdodik: a ciklus végrehajtási feltétele a szög-letes zárójelek közé zárt kifejezés; ha ennek logikai értéke igaz, azaz az n shell-változó értéke nagyobb vagy egyenlo mint nulla, akkor végrehajtódik a ciklustörzs. Figyeljük meg, hogy mi-vel a do kulcsszó nem külön sorban szerepel, kell eléje a végrehajtási feltétel lezárására a pontosvesszo szeparátor. (Maga a [ $n -gt 0 ] feltételmegadás egy formai rövidítés, a [ ... ] forma a UNIX test parancsának jelzésére szolgál. A feltételmegadás teljes formájában kiírva tehát while test $n -gt 0 lenne.)

A következo sorban az echo parancs kiírja a 07 ASCII kódú karaktert (CTRL-G), ami a ter-minálon a hangjelzést generálja. A \c biztosítja az echo parancsban azt, hogy a csengokarak-ter „kiírása” után ne íródjék ki feleslegesen egy újsor karakter is.5 A következo sorban az expr parancs kifejezésként feldolgozza az argumentumokat, amelyekkel meghívták, s az ered-ményként kapott értéket (jelen esetben az n változó értékénél eggyel kisebb számot) kiírja a standard outputra; a `...` metakarakterek segítségével azonban ezt az értéket argumentumként átadhatjuk az n shell-változó új értékének beállítását végzo parancsnak. E kissé bonyolult módon sikerült n értékét eggyel csökkenteni.

exch: állományok cseréje

Az exch shell program két állomány nevét cseréli fel. Elsoként egy ideiglenes állománynévre nevezi át az egyik állományt, majd hármas cserét hajtva végre végül a két kiindulási állomány neve felcserélodik. A programban két említésre érdemes vonás van. Az egyik az egyedi nevu állományok létrehozásával kapcsolatos. Számos esetben lehet szüksége arra egy programnak, hogy egyedi nevu állományokat hozzon létre, például ha egyidejuleg több felhasználó is fut-tatja a programot, s mindegyik futó példány önálló ideiglenes állományokat kell hogy gene-ráljon. E célra igen alkalmas a shell $$ jelölésu shell-változójának használata: ez ugyanis mindig az adott folyamat azonosítóját, a PID értékét tartalmazza. Mivel a UNIX gondoskodik arról, hogy a PID értékek egyediek legyenek, az ennek felhasználásával létrehozott állomány-nevek is egyediek lesznek. Az alábbi program elso sorában ennek kihasználásával hoztuk lét-re a TMP nevu ideiglenes állományt, pontosabban az állomány nevét. A következo sorban megadott utasításokat a && karakterek választják el; ez a rövidítés azt jelenti, hogy a pa-rancssor következo parancsa csak akkor fut le, ha az elozo parancs visszatérési értéke igaz volt (0 exit státusz), azaz ha az elozo program sikeresen lefutott. (E megadás végso soron egy else ág nélküli if szerkezettel azonos.) A && jelölés párja a || karakterpár, mely azt jelzi, hogy a soron következo parancs csak akkor fut le, ha az elozo logikai értéke hamis volt. $ cat exch

4 Magát a var változót állítja be! 5 BSD Unix alatt az echo-n révén érhetõ el ugyanez a hatás.

Page 161: unix kézkönyv

10. fejezet Shell programozás

163

TMP="exch$$" mv $1 $TMP && mv $2 $1 && mv $TMP $2 $ ls -l semmi valami; exch semmi valami; ls -l semmi valami -rw-r--r-- 1 guest other 124 Apr 17 20:08 semmi -rw-r--r-- 1 guest other 42 Apr 17 20:07 valami -rw-r--r-- 1 guest other 42 Apr 17 20:07 semmi -rw-r--r-- 1 guest other 124 Apr 17 20:08 valami $

same_nm: azonos nevu állományok keresése

A same_nm program végignézi a /bin, /usr/bin és /etc katalógusokat, s kiírja mindazokat az állományokat, amelyek ezen katalógusok valamelyikében szerepelnek, s azonos nevuek a pa-raméterként megadott állománnyal. $ cat same_nm # same_nm -- find files of same name in /bin,/usr/bin,/etc directories usage='usage:\tsame_nm files' s1="/bin" s2="/usr/bin" s3="/etc" case $# in 0) echo $usage; exit;; esac case $1 in '-?') echo $usage; exit;; esac for i do [ -s "$s1/$i" ] && ls -l $s1/$i [ -s "$s2/$i" ] && ls -l $s2/$i [ -s "$s3/$i" ] && ls -l $s3/$i done $

A program elso case szerkezetében azt vizsgáljuk, hogy hány paraméterrel lett meghívva same_nm. $# az adott program pozicionális paramétereinek számát adja meg ($0 nem számít bele); ha ez az érték nulla akkor same_nm kiírja help szövegként az elore definiált usage shell-változó tartalmát, és az exit parancs hatására terminálja magát. A következo case szerkezet az elso pozicionális paramétert vizsgálja, s ha az -?, akkor szintén a helpszöveget írja ki, majd befejezodik. Nem véletlen a '-?' minta megadásánál a '...' idézo-jelpár használata: ha nem védenénk le ezáltal a -? stringet a shell-tol, akkor az a ? karaktert metakarakterként értelmezné, s minden - karakterrel kezdodo argumentum hatására ezt az ágat hajtaná végre.

Page 162: unix kézkönyv

UNIX felhasználói ismeretek

164

Végül a for ciklusban minden pozicionális paraméterre végrehajtódik a három if ág; a rövidí-tések miatt nehezen értelmezheto elso ránézésre, de már láttuk, hogy a [ .. ] karakterek közti rész a test utasításnak felel meg, az utánuk írt && pedig az elozo (test) parancs sikeres lefu-tása esetén hajtódik csak végre: azaz ha a "$s1/$i" nevu állomány létezik és nem nulla a hossza, akkor az ls paranccsal kiírja részletes adatait. $ same_nm passwd -r-sr-sr-x 1 root sys 22272 Mar 28 1990 /bin/passwd -r--r--r-- 1 root sys 1190 Mar 13 10:08 /etc/passwd $

updt: frissen módosított állományok listázása

Az updt program azoknak az állományoknak az adatait listázza ki (az ls opciói használható-ak), amelyeket egy adott idon belül módosítottunk. Default beállítása szerint a kiindulási ka-talógusban végzi el a vizsgálatot, az aznap módosított állományokat keresve. Az opciók utáni elso paraméter, ha szerepel, a katalógus, ahonnan kiindulva keresünk, ezután lehet megadni az idohatárt, a find parancs jelölésmódja szerint.

Page 163: unix kézkönyv

10. fejezet Shell programozás

165

$ cat updt # updt -- list files updated in [dir] in the last [n] day usage='Usage:\tupdt [-?logtasdrucifp] [dir (def:$HOME)] [[+-] day (def:0)]\n \t\t+/-<n> means more/less than <n> days' f=/tmp/updt.dat until test $# -eq 0 do case $1 in '-?') echo $usage; exit;; -*) flags="$flags $1"; shift;; *) break;; esac done if test "$flags" then find ${1-$HOME} -mtime ${2-0} -type f -print >$f if test -s $f then ls $flags `cat $f` fi rm -f $f else find ${1-$HOME} -mtime ${2-0} -type f -print fi exit $

Az until ágban addig marad a program, amíg valamennyi pozicionális paramétert fel nem dolgoz-ta, azaz amíg $# értéke nullára nem csökken. A paraméterfeldolgozást a case ciklus végzi, amely az elso pozicionális paramétert vizsgálja, a same_nm esetében látott módon lekezeli a segélykéro -? opciót, az összes többi opciót pedig hozzáírja a flags nevu shell-változóhoz. A shift parancs arra szolgál, hogy a pozicionális változókat eggyel balra léptesse, azaz $1 törlodik, $2-bol $1 lesz, s így tovább. Amikor nem opció a pozicionális paraméter, akkor a ciklus megszakad, a további pozicionális paramétereket változatlanul hagyva.

A program további része egy if-else szerkezetbe ágyazódik. Ha nem adtunk meg opciókat (flags nullstring, ez az else ág), akkor a find parancs hajtódik végre, s a talált állományoknak pusztán az elérési neveit írja ki. Ha ellenben definiáltunk opciókat, akkor a find parancs az f ideiglenes állományba irányítja kimenetét. Ha a find talált állományokat, akkor az f ideiglenes állomány hossza nagyobb mint nulla (ezt vizsgálja a test -s parancs), s ekkor az ls parancs argumentumlistaként megkapja a talált állo-mányok neveit. A paraméterátadás azért történt ilyen bonyolult módon, mert ha az ls `find ...` szerkezetet használtuk volna, akkor a program nem muködne helyesen. Ha ugyanis a find nem talál a feltételeknek megfelelo állományt, akkor argumentumként egy nullstringet ad át ls-nek; ls viszont ignorálja a nullstringet, s tényleges argumentum hiányában az aktuális kata-lógust listázza ki.

Page 164: unix kézkönyv

UNIX felhasználói ismeretek

166

$ updt -? Usage: updt [-?logtasdrucifp] [dir (def:$HOME)] [[+-] day (def:0)] +/-<n> means more/less than <n> days $ updt /usr/guest/.lastlogin /usr/guest/valami /usr/guest/vers1 /usr/guest/semmi /usr/guest/vers2 /usr/guest/2 /usr/guest/log.log /usr/guest/lo /usr/guest/semmi1 /usr/guest/delta /usr/guest/bundle /usr/guest/same_nm /usr/guest/updt /usr/guest/exch /usr/guest/bell /usr/guest/3 /usr/guest/4 /usr/guest/5 /usr/guest/6

bundle: programcsomagok tömörítése és kibontása

Ez a program a shell programozás egyik gyöngyszeme, egyszerusége és hasznossága révén egyaránt.6 Arra a célra szolgál, hogy számos apró kis shell programocskát egyetlen állomány-ba összecsomagolva lehessen máshova elküldeni, floppyra menteni stb, s rendeltetési helyén automatikusan lehessen az eredeti programokat kicsomagolni és visszanyerni. (Az állomá-nyok nem feltétlenül kell hogy shellscript-ek legyenek, az egyetlen megkötés az, hogy ne bi-náris állományok legyenek.)

Az összecsomagolandó állományokat egyszeruen a bundle file(s) paranccsal lehet összevon-ni (defaultban bundle is a standard outputra ír). Kicsomagoláskor, ha mondjuk pkg volt a csomag neve, az sh pkg parancs automatikusan létrehozza az eredeti állományokat. $ cat bundle # bundle: group files into distribution package

6 E programot (amely egyébként a shar nevû public-domain program shellscript formában megírt változata) a Kernighan-Pike: The Unix Programming Euvironment címû könyvbõl vettük át — lehetett volna hasonló scriptet írni, de nem érdemes, most — legalábbis szerzõk szerint — ennél jobban és tömörebben kevés program tudja a shell lehetõségeit bemutatni.

Page 165: unix kézkönyv

10. fejezet Shell programozás

167

echo '# To unbundle, sh this file' for i; do echo "echo $i 1>&2" echo "cat >$i <<'=== End of $i ==='" cat $i echo "=== End of $i ===" done $ $ mkdir newdir; bundle bundle 2 same_nm >newdir/package.pkg; $ cd newdir; ls -l total 2 -rw-r--r-- 1 guest other 769 Apr 17 20:20 package.pkg $

Page 166: unix kézkönyv

UNIX felhasználói ismeretek

168

$ cat package.pkg # To unbundle, sh this file echo bundle 1>&2 cat >bundle <<'=== End of bundle ===' # bundle: group files into distribution package echo '# To unbundle, sh this file' for i do echo "echo $i 1>&2" echo "cat >$i <<'=== End of $i ==='" cat $i echo "=== End of $i ===" done === End of bundle === echo 2 1>&2 cat >2 <<'=== End of 2 ===' # 2,3,...: print in multiple columns pr -$0 -t -l1 $* === End of 2 === echo same_nm 1>&2 cat >same_nm <<'=== End of same_nm ===' # same_nm -- find files of same name in /bin,/usr/bin,/etc directories usage='usage:\tsame_nm files' s1="/bin" s2="/usr/bin" s3="/etc" case $# in 0) echo $usage; exit;; esac case $1 in '-?') echo $usage; exit;; esac for i do [ -s "$s1/$i" ] && ls -l $s1/$i [ -s "$s2/$i" ] && ls -l $s2/$i [ -s "$s3/$i" ] && ls -l $s3/$i done === End of same_nm === $ $ sh package.pkg; ls -l bundle 2 same_nm total 8 -rw-r--r-- 1 guest other 56 Apr 17 20:21 2 -rw-r--r-- 1 guest other 175 Apr 17 20:21 bundle -rw-r--r-- 1 guest other 769 Apr 17 20:20 package.pkg -rw-r--r-- 1 guest other 343 Apr 17 20:21 same_nm

Page 167: unix kézkönyv

10. fejezet Shell programozás

169

$

A bundle muködése azon a trükkön alapszik, hogy maga is egy végrehajtható shellscript-et generál, amelyben a kicsomagoló parancsok, illetve az összecsomagolt programok szövege is benne van, s ezeket a „vételi oldalon” a beágyazott input mechanizmusa segítségével állítja helyre.

— Elso lépésként a keletkezo állományba egy shell commentet tesz be, ez arra jó, hogy a vételi oldalon tájékoztassa a felhasználót, hogyan is kell kicsomagolnia a keletkezo ál-lományt.

— A továbbiakban egy for ciklus révén a tömörítendo valamennyi állományra végrehajtja az alábbiakat:

— Beír a keletkezo állományba egy olyan parancsot, amely a standard error csatornára ki-írja az aktuális állomány nevét (itt ugyanis a shell már kifejtette a $i paramétert, tehát egy konkrét állománynév szerepel);

— beír a keletkezo állományba egy olyan parancsot, amelyik beágyazott inputként az ak-tuális állományba írja az === End of állománynév === stringig terjedo részt;

— most a keletkezo állományba beírja magát a továbbítandó állományt; — végül beírja a keletkezo állományba a beágyazott inputot záró === End of állomány-

név === szekvenciát.

Page 168: unix kézkönyv

170

11. FEJEZET

A C SHELL

A C shell a BSD alapú UNIX rendszerekben terjedt el elsoként, de hamarosan ez is szabvá-nyos része lett a UNIX-nak, így ma minden rendszerben megtalálható. E shell szintaxisában is eltér a Bourne shell-tol, számos, a Bourne shell-ben meglévo konstrukciót egészen más mó-don kell hívni. Cserébe viszont jóval többet tud: ezek közül leggyakrabban a parancssor szer-kesztésének lehetoségét és a régi parancsok visszaidézhetoségét szokták használni, de hason-lóképpen kellemes szolgáltatás az aliasing mechanizmusa, amelynek révén hosszú parancsok-ra rövid nevekkel tudunk hivatkozni, illetve a C nyelvre erosen hasonlító, igen komplex ve-zérlési szerkezetek éppúgy, mint a parancsnevek automatikus kiegészítése gépelés közben. Természetesen a C shell-ben is lehetoség van arra, hogy shell parancsokat tartalmazó fájlokat, úgynevezett shellscript-eket hajtsunk végre, de ilyen célra több ok miatt sem szokták javasol-ni, mind a Bourne, mind az azzal felülrol kompatíbilis Korn shell alkalmasabb e célra. Éppen e megfontolásokból mi is a C shell interaktív, parancssori használatára összpontosítunk, bár lesznek példák shellscript-ekre, illetve shellscript-ekben alkalmazható mechanizmusokra is.

A C shell indítása Ha bejelentkezési shell-ünk nem a C shell, a parancssorban kiadott csh

paranccsal tudjuk elindítani. Hacsak a konfigurációs fájlokban másképpen nem rendelkezünk, a prompt a % jel lesz, privilégizált felhasználó esetében a # jel.

Kilépés a C shell-bol Hasonlóan a Bourne shell-hez, az eof (rendszerint CTRL-D) karakter hatására kiléphetünk a C shell-bol is, feltéve hogy az ignoreeof flag nincs beállítva. E flagnek ugyanis éppen az a szerepe, hogy megelozze a véletlen kiléptetést a shell-bol. Tegyük fel például, hogy egy alkal-mazásunknak akartuk jelezni a CTRL-D karakterrel a bevitel végét, szerencsétlen módon azonban kétszer nyomjuk le a gombot, vagy hosszan tartjuk rajta kezünket és ismétel a billen-tyuzet: az eredmény ugyanaz, a második vezérlokaraktert már a shell „veszi magára”, és ki-léptet, ami alkalmanként igen kellemetlen is lehet, például ha modemen keresztül jelentkez-

Page 169: unix kézkönyv

11. fejezet A C shell

171

tünk be. Az ignoreeof flag hatására a C shell figyelmen kívül hagyja az eof funkcióhoz ren-delt karaktert, és csak külön parancsra léptet ki.

A kilépteto parancs általában az exit, hacsak nem a login shell-rol van szó; ebben az esetben a logout parancs hatására léphetünk ki a shell-bol.

A C shell konfigurációs fájljai Amikor a C shell-t elindítjuk, az alapkatalógusunkban lévo .cshrc fájl tartalmát beolvassa és végrehajtja a shell. Ez a tevékenység minden egyes C shell indításakor végrehajtódik, tehát ha valamilyen oknál fogva több shell-t indítunk el egymás fölött, akkor annyiszor, ahány shell-t indítottunk. (Ugyanez igaz akkor is, ha egy ablakkezelo rendszerrel rendelkezo gépen egy olyan új ablakot nyitottunk, amelyik C shell-t használ.)

Abban az esetben, ha az elindult C shell a bejelentkezési shell, a .cshrc lefutása után a .login fájl tartalmát is végrehajtja a rendszer, feltéve hogy létezik ilyen fájl az alapkatalógusunkban.

A login shell-bol való kilépéskor a .logout fájl tartalma is végrehajtódik (természetesen me-gint csak akkor, ha létezik ilyen fájl).

Látható, hogy ellentétben a Bourne shell konfigurációs mechanizmusával, itt nem egy-egy rendszer-, illetve felhasználó-specifikus konfigurációs fájl szerepel (/etc/profile, illetve $HOME/.profile), hanem két felhasználó-specifikus állomány. Mindez nem okoz különösebb gondot, mindkét rendszerrel megoldhatóak a tipikus konfigurációs problémák1. Mivel a .cshrc minden shell indításakor lefut, ebben célszeru a shell-változók beállítását elvégezni, míg a .login fájlban az egyszeri, bejelentkezéssel kapcsolatos teendoket, például termináltí-pus- és paraméterek beállítása, postaellenorzés stb.

A .cshrc konfigurációs fájl

Az alábbiakban egy tipikus .cshrc fájlt mutatunk be. Rendszerint azokat a konfigurálandó ér-tékeket szokás itt beállítani, amelyek minden shell lefutásnál az applikációtól függoen változ-hatnak, például keresési útvonal beállítása, a felhasználó által specifikált egyedi shell-változók, stb. hp 22: cat .cshrc # Default keresesi utvonal beallitasa: set path=( /bin /usr/bin /usr/local/bin $home/bin . )

1 Ha mindenképpen szükség van egy rendszer-specifikus közös konfigurációs fájlra, a késõbb megismerendõ source parancs segítségével lehet meghívni mindenki számára lefutó konfigurációs állományt. Egyes rendsze-rekben ezenkívül kibõvítették a C shellt úgy, hogy lehetõség van egy rendszer-specifikus konfigurációs fájl hasz-nálatára is.

Page 170: unix kézkönyv

UNIX felhasználói ismeretek

172

# C shell kornyezet beallitasa: if ( $?prompt ) then # interaktiv shell # nyilvantartott elozo parancsok set history=20 # belepesek kozt megorzendo parancsok szama set savehist=20 # rendszer neve set system=`hostname` # a parancs prompt definicioja set prompt = "$system \!: " # alias beallitasok: alias h history alias dir ls -al endif

A .login konfigurációs fájl

A .cshrc után végrehajtódó .login fájl elsosorban a globális parancsokat tartalmazza, azokat, amelyeket csak egyszer célszeru lefuttatni, a rendszerbe történo bejelentkezéskor. Az alábbi példa egy tipikus .login állományt mutat: hp 23: cat .login # idozona beallitas: setenv TZ MET-1METDST # postafiok beallitas: setenv MAIL /usr/mail/demo # terminal beallitas: # default terminal lekerdezese es beallitasa eval `tset -s -Q -m ':?hp' ` # terminalparameterek beallitasa stty erase "^H" kill "^U" intr "^C" eof "^D" susp "^Z" hupcl ixon ixoff tostop cs8 -istrip # tabulator-kezeles beallitasa tabs # shell kornyezet beallitas: set noclobber # letezo fajl felulirasat letiltja # globalis parancsok: # altalanos kozlemenyek news | more

A .logout konfigurációs fájl

Értelemszeruen ebbe a fájlba olyan programok kerülnek, amelyeket kilépéskor szándékozunk végrehajtatni. (Általában nem sok ilyen tevékenység akad; olyan gépeken, ahol nyilvántartják

Page 171: unix kézkönyv

11. fejezet A C shell

173

az egyes felhasználók által felhasznált gépidot, vagy egyéb eroforrásokat, ezek felhasználásá-ról szokták kiíratni a statisztikát.)

Page 172: unix kézkönyv

UNIX felhasználói ismeretek

174

Metakarakterek semlegesítése Mielott módszeresen végigmennénk a metakaraktereken, eloször azt nézzük meg, adott eset-ben hogyan lehet ezek speciális jelentését elnyomni, ugyanis ez némiképp eltér a Bourne shell-nél megszokottaktól. Akár a Bourne shell-nél, itt is három módon nyomhatjuk el a metakarakterek speciális jelen-tését, a levédendo metakarakter elé helyezett backslash (\) karakterrel, vagy annak szimpla, il-letve dupla idézojelek közé ('..', "..") közé zárásával. E három módszer „erosségében” tér el egymástól. A dupla idézojelek között levédett karakterekre a shell paraméterbehelyettesítési szabályai továbbra is érvényesek, azaz például a shell-változók nevét a C shell a dupla idézo-jelek között is kifejti. A szimpla idézojelek hatása már eltér a Bourne shell-ben megszokottól: noha itt is „erosebb” a dupla idézojelnél, de a (késobb tárgyalandó) eseménybehelyettesítésnél használt felkiáltójel speciális jelentését nem nyomja el. Így az ese-ménybehelyettesítés szimpla idézojel párok között is végbemegy, mint azt a prompt változó definiálásánál ki is használtuk a példaként bemutatott .cshrc fájlban. Tökéletes védelmet csak a backslash karakter nyújt.2

Szintaktikus metakarakterek Szintaktikus metakarakterek azok a metakarakterek, amelyekkel parancsokat lehet csoportosí-tani, elválasztani, illetve parancscsoportok végrehajtását vezényelni. E metakarakterek értel-mezése azonos a Bourne shell-ével.

; Az egy parancssorban begépelt parancsokat választja el, jelentésében azonos értéku az újsor karakterrel.

| Az elválasztott két parancsot csovezetékbe kapcsolja, az elso parancs kimenete a máso-dik bemenetére kerül.

() A pontosvesszovel elválasztott vagy csovezetékkel összefuzött parancsokat egy cso-portban, egy külön shell-t indítva hajtja végre.

& Az elotte szereplo parancs(oka)t háttérfolyamatként hajtja végre. A háttérben indított parancs indulásakor rögtön megjelenik az új parancsprompt, nem várja meg az elozo parancs befejezodését.

|| Az utána szereplo parancsokat csak akkor hajtja végre, ha az elotte szereplo parancs si-kertelen volt (az ennek megfelelo logikai értékkel tért vissza).

&& Az utána következo parancsokat csak akkor hajtja végre, ha az elotte szereplo parancs sikeres volt (az ennek megfelelo logikai értékkel tért vissza).

2 A '!' karakter akkor is elveszti speciális jelentését, ha szóköz, újsor karakter, tabulátor, illetve '(' vagy '.' karakter követi.

Page 173: unix kézkönyv

11. fejezet A C shell

175

# Hasonlóan a Bourne shell-hez, a megjegyzéseket vezeti be, ezeket a shell figyelmen kí-vül hagyja. Ha azonban a sor elején szerepel, egyéb speciális jelentéssel is bírhat, errol a „Parancsvégrehajtás folyamata” c. pontban lesz szó.

Automatikus fájlnév kiegészítés Az automatikus fájlnév kiegészítés a C shell igen kellemes szolgáltatása (a Korn shell-ben is megtalálható). Lényege, hogy egy parancssor begépelésekor nem kell a kívánt fájlnevet teljes egészében végiggépelni, hanem annak egy részét megadva a shell kikeresi az illeszkedo nev(ek)et, s felajánlja azokat.3 Ha a parancssor gépelése közben az eof funkcióhoz rendelt karaktert leütjük (mint láttuk már, ez rendszerint a CTRL-D), akkor az utoljára begépelt argumentum helyett a shell az összes így kezdodo fájlnevet kilistázza, majd újra kiírja az eddig begépelt parancssort, ránk bízva, hogy a megfelelo fájlnevet beírjuk. Ha a parancssorban az ESC karaktert gépeljük be, akkor az utolsónak begépelt argumentumot a leghosszabb olyan fájlnévvel helyettesíti a shell, aminek az eleje illeszkedik az argumen-tumra. (Ha ilyet nem talál, vagy többet is talál, sípolással figyelmeztet.) Ha a behelyettesítendo argumentum a tilde (~) karakterrel kezdodik, a C shell nem az illesz-kedo fájl-, hanem a felhasználói neveket fogja kilistázni, illetve behelyettesíteni.

Parancsszerkesztési lehetoségek a C shell-ben

A C shell számos parancsszerkesztési lehetoséget kínál, ezek lehetové teszik, hogy az elozo parancsok átszerkesztésével megspóroljuk a hosszú parancsok újragépelését, illetve régebben begépelt parancsokat és parancssorozatokat könnyuszerrel megismételjünk. Ennek megvaló-sítására a C shell egy eseménypuffert4 (event buffer) definiál, s az utoljára begépelt parancso-kat e pufferban tárolja. Amikor parancsszerkesztést hajtunk végre, a shell ennek a puffernak a tartalmán operál. Lehetoségünk van többek között arra, hogy elozo eseményeket (parancso-kat) teljesen megismételjünk, vagy különbözo parancsokból más-más részeket, argumentumo-kat összeollózva állítsunk össze végrehajtandó parancsokat stb.

3 Ehhez be kell állítani a filec shellváltozót. 4 Az esemény, illetve eseménypuffer elnevezés azért használatos a parancs és parancspuffer helyett, hogy ezzel is hangsúlyozzák a tényt, miszerint a módosítandó és újra felhasználandó parancsok valójában igen bonyolult, komp-lex utasításstruktúrák is lehetnek.

Page 174: unix kézkönyv

UNIX felhasználói ismeretek

176

Parancshistória megtekintése

A shell által tárolt parancsok listáját a history paranccsal nyerhetjük elo: hp 21: history 2 exit 3 mailx 4 cat .cshrc 5 cat .login 6 env 7 set lo=1 8 echo $lo 9 set lo = 2 10 echo $lo 11 nslookup lwr.camaz.mx 12 nslookup 13 ping lwr.camaz.mx 14 /etc/ping lwr.camaz.mx 15 ping 192.93.224.53 16 /etc/ping 192.93.224.53 17 /etc/ping 192.93.224.11 18 telnet lwr.camaz.mx 19 telnet lwserv.camaz.mx 20 finger [email protected] 21 history hp 22:

Parancsok ismételt végrehajtása

Az elozo parancsokat a megadott eseményre való hivatkozással lehet újra végrehajtatni. Az eseményekre háromféleképpen lehet hivatkozni:

— az esemény sorszámával; — az esemény relatív elhelyezkedésével a pillanatnyi eseményhez képest; — az esemény szövegével, vagy abból kiemelt mintával.

A fentiek speciális eseteként a legutoljára végrehajtott parancsot a !! karakterekkel tudjuk végrehajtani. E jelölésbol az elso felkiáltójel a parancsbehelyettesítési mechanizmust indítja, a második pedig a legutolsónak végrehajtott parancsra hivatkozik.

Hivatkozás az esemény sorszámával

Az esemény sorszámára való hivatkozáskor a kezdo felkiáltójel után az újra végrehajtatni kívánt parancs esemény sorszámát kell megadni. Ezt az információt persze csak akkor tudjuk használ-ni, ha valamilyen formában rendelkezésünkre áll; ha a promptunk nem írja ki az eseménysorszá-mot, definiáljuk át a .cshrc fájlban a prompt változót úgy, hogy az az alábbiakat (is) tartalmaz-za: set prompt = "\!% "

Page 175: unix kézkönyv

11. fejezet A C shell

177

Az elozoekben példaként bemutatott history lista alapján például a !10 parancs hatására az echo $lo parancs fog újra végrehajtódni: hp 22: !10 echo $lo 2 hp 23:

Végrehajtás elott az ismétlendo parancsot kiírja a shell, tehát látjuk, hogy mit hajtunk végre; módo-sítani viszont, legalábbis ez esetben, nem tudjuk a parancsot.

Hivatkozás az esemény relatív elhelyezkedésével

E hivatkozási mód alapvetoen hasonlít az elozohöz, az eltérés annyi, hogy nem egy abszolút sorszám alapján azonosítjuk az újra végrehajtandó parancsot, hanem a pillanatnyi esemény-sorszámhoz képest adjuk meg pozícióját. Ha például promptunk a 23 értéket mutatja, a !-20 parancs hatására a mailx parancs fog végrehajtódni: hp 23: !-20 mailx No mail for demo hp 24:

Elofordulhat, hogy az ily módon megadott eseményre a shell az "Event not found." hibaüze-nettel reagál. Ez foként akkor fordul elo, ha olyan eseményre hivatkozunk, ami már kiesett az eseménypufferünkbol. (A puffer méretét a history shell-változóban állíthatjuk be, általában 15-20 körüli értékre; ha mondjuk 20 a beállított érték, az ezelotti huszonkettedik parancsot nem tudjuk már elovarázsolni.)

Hivatkozás az esemény szövegével

Az esemény szövegére történo hivatkozás a legegyszerubb: a felkiáltójel után egyszeruen gé-peljük be a megismételni kívánt parancs elso néhány betujét, annyit, ami egyértelmuen meg-különbözteti az eseménypufferben lévo többi parancstól. Például a !ma parancs hatására a mailx parancs fog újra lefutni: hp 24: !ma mailx No mail for demo hp 25:

Az ilyen „eseményillesztés” határa az elso fehér karakter (szóköz, tabulátor); a C shell csak az eddig terjedo részt használja az eseményillesztésnél, az általunk megadott minta többi ré-szét a megtalált parancsnak adja át argumentumként. Az alábbi példában az !ls -l

Page 176: unix kézkönyv

UNIX felhasználói ismeretek

178

parancs megadásakor nem az általunk gondolt ls -l parancsot (#38) fogja illeszteni a C shell, hanem, mivel az eseményillesztésnél használt ls több parancsra is illett, azok közül veszi az utolsót (#39), s ahhoz fuzi hozzá argumentumként a -l opciót: hp 40: history 37 ls -a 38 ls -l 39 ls /etc 40 history hp 41: !ls -l ls /etc -l

itt a /etc katalóguslistája közetkezik... -l not found hp 42:

Gyakran kézenfekvobb lenne, ha nem a parancsszó, hanem a parancs tetszoleges része alap-ján tudnánk az elozo parancsokra hivatkozni. Ilyenkor a !?minta? megadást használhatjuk, ahol minta a keresett parancsban bárhol szereplo karaktersorozat lehet. Az elobbi példánál maradva: hp 43: !?-l? ls -l total 378 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 14 Aug 29 16:53 akarmi -rw-rw-rw- 1 demo guest 530 Aug 29 16:46 file -rw-r-xr-x 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 -rwxrwxrwx 1 demo guest 11 Aug 30 21:03 nf -rwxrwxrwx 1 demo guest 14 Sep 2 09:51 nf1 -rw-rw-rw- 1 root sys 31 Sep 1 13:45 ravasz -rw-rw-rw- 1 demo guest 13 Aug 29 16:53 semmi lrwxrwxrwx 1 demo guest 20 Aug 23 23:14 sendmail.cf -> /usr/lib/sendmail.cf -rw-rw-rw- 1 demo guest 54 Aug 29 16:57 temp -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text hp 44:

Parancs argumentumok újra felhasználása

E mechanizmus arra ad lehetoséget, hogy ne csak teljes parancsokat hajtsunk végre az ese-ménypufferbol, hanem az elozo események parancs argumentumait önálló építokockákként használjuk fel. A C shell ugyanis nem csak magukat a végrehajtott eseményeket számozza meg, de az egyes parancsok argumentumait is. Egy tetszoleges argumentumra úgy hivatkoz-hatunk, hogy az elozoekben látott bármelyik módszerrel megnevezzük a parancsot, amelyben

Page 177: unix kézkönyv

11. fejezet A C shell

179

a kívánt argumentum elofordult, majd egy kettospont (:) karakter után az alább ismertetendo módon hivatkozunk az argumentumra.

Az argumentumokra a Bourne shell-nél látott módon, mint sorszámokra hivatkozunk, a kü-lönbség az, hogy most nem kell oket a dollár ($) jelnek megeloznie. Például a !18:0 hatására a telnet szó fog behelyettesítodni, mert a 18-as esemény sorszámú parancs nulladik paraméte-re maga a parancs neve, esetünkben a telnet.

Két kényelmi jelölés is rendelkezésre áll: a csákó (^) karakter a mindenkori második szóra, tehát rendszerint a parancsnevet követo elso argumentumra hivatkozik, a dollár ($) karakter pedig a legutolsó szót jelöli. Végül a csillag (*) karakterrel az elso (azaz a számozásban a nulladik) argumentumot követo összes argumentumra hivatkozhatunk. Egy példa talán vilá-gosabbá teszi a dolgokat: ha a parancs, amibol csemegézünk a 13. esemény sorszámú volt és így nézett ki: cat alma korte repa

akkor

!13:0=cat, !13:1=alma, !13:2=korte, !13:3=repa, !13:^=alma, !13:$=repa és !13:*="alma korte repa".

Lehetoség van arra is, hogy ne csak egy, hanem több egymást követo argumentumra is hivat-kozzunk, ilyenkor a kettospont után egy kötojellel elválasztott listát lehet megadni. A !7:3-$ jelölés például a hetedik parancs összes paraméterét kijelöli, a harmadiktól kezdve.

E mechanizmus használhatóságát nagymértékben növeli az a tény, hogy tetszoleges helyre beszúrhatóak az ily módon megjelölt argumentumok, és egy parancsot több helyrol vett „fo-darabokból” barkácsolhatunk össze.

A C shell egy nagyon fontos tulajdonságára kell itt felhívnunk az olvasó figyelmét: a fenti ar-gumentum behelyettesítési eljárásban a C shell kicsit másképpen értelmezi az argumentum fogalmát, mint ahogy azt a Bourne shell-nél láttuk. A Bourne shell-nél argumentumnak csak azokat a karaktersorozatokat neveztük, amelyeket a végrehajtandó parancsnak átadott a shell, tehát például az átirányításra vonatkozó metakaraktereket (<, >, >>) nem, hiszen ezeket a shell maga dolgozta fel, a végrehajtandó program ezek létezésérol nem tudott, nem is tudha-tott. A C shell azonban a fontosabb metakaraktereket önálló argumentumként kezeli, lega-lábbis a fenti argumentum behelyettesítési eljárás során.

Elozo események módosítása

A fentiekben már látott eszközökkel módunk van arra, hogy elozo parancsokból átvett dara-bokkal operáljunk. Az alább következo eszközökkel lehetoségünk nyílik arra is, hogy módo-sítsuk az így eloállított új parancsot. E célra az úgynevezett eseménymódosítók szolgálnak, melyek listáját az alábbiakban közöljük.

Az eseménymódosítókat, akárcsak az argumentumokra történo hivatkozásokat, a kettospont (:) karakter elozi meg.

Page 178: unix kézkönyv

UNIX felhasználói ismeretek

180

Ha egy teljes elozo eseményre hivatkozunk, s ez után szerepel eseménymódosító, akkor an-nak hatása az egész kijelölt eseményre érvényes lesz. Ha egy eseménybol argumentumokat jelöltünk ki, akkor az eseménymódosító hatása arra az argumentumra terjed ki, amelyik után szerepel. Egy argumentum vagy esemény után több eseménymódosítót is megadhatunk.

Az eseménymódosítók listája a következo: s/old/new Az old string elso elofordulását lecseréli a new stringre. Ha a new stringben az 'at' (&)

jel szerepel, akkor annak helyére behelyettesítodik az old string. Fontos megjegyezni, hogy csak egyszeres behelyettesítést végez ez a parancs, ha többször akarjuk végrehaj-tani, a g eseménymódosítót is használnunk kell.

g Önmagában nem, csak más eseménymódosítókkal együtt használható, az elozo módosí-tó (tipikusan az s) hatását a teljes parancssorra kiterjeszti. Ha például egy parancssor-ban az összes old stringet a new stringre kell cserélnünk, a gs/old/new paranccsal érjük el a kívánt eredményt. Vigyázzunk! Egy parancsargumentumon belül csak egy helyet-tesítés hajtható végre, még a g eseménymódosító megadása esetén is, tehát ha például a

mv /usr/src/srclib /tmp parancsban szeretnénk az elso fájlnevet /usr/oldsrc/oldsrclib névre cserélni, a gs/src/old& parancs hatására is csak a

mv /usr/oldsrc/srclib /tmp eredményt kapjuk. Ugyanakkor a mv /usr/src /usr/lib/src /tmp parancsra kiadva a fenti módosítókat, a várakozásunknak

megfelelo eredményt kapjuk, azaz a mv /usr/oldsrc /usr/lib/oldsrc /tmp parancsot, hiszen a g flagnek megfeleloen minde-

gyik argumentumban megtörtént a csere — egyszer. p A megnevezett eseményt kilistázza a képernyore, de nem hajtja végre. Ez kivált akkor

lehet hasznos a számunkra, ha egy komplex parancsot akarunk editálni, és nem va-gyunk biztosak abban, hogy egy lépcsoben végre tudjuk hajtani az összes módosítást.

q Nem engedélyez további módosításokat az adott argumentumon. h A fájlnévnek tekintett argumentumról levágja az utolsó fájlnév komponenst, azaz csak

a katalógus részt hagyja meg. Például a /usr/src/proba.c.1 névbol e módosító hatására /usr/src lesz.

t A h módosító ellentéte: a fájlnévnek tekintett argumentum utolsó névelemét tartja csak meg, azaz levágja a katalógus-részt. A /usr/src/proba.c.1 fájlnévbol a proba.c.1 részt hagyja meg.

r A fájlnévnek tekintett argumentum kiterjesztését (azaz az utolsó pont (.) karakter utáni részt, ha van olyan) levágja, tehát például a proba.c.1 fájlnévbol proba.c lesz.

& Megismétli a legutoljára végrehajtott helyettesítési muveletet. Ez a flag használható például az s eseménymódosító „kicselezésére”, amikor egy argumentumon belül szeret-nénk többszörös helyettesítéseket végrehajtani.

Page 179: unix kézkönyv

11. fejezet A C shell

181

Az alias mechanizmus Az alias5 mechanizmus, amit a C shell és a Korn shell is nyújt a felhasználónak, igen hasznos eszköz olyankor, amikor általunk gyakran használt, bonyolultan leírható parancsszekvenciák-ra akarunk egy rövid névvel hivatkozni. Muködési elvében az alias mechanizmusa a makrókra hasonlít leginkább; amint a shell egy aliasra bukkan, kifejti azt az alias definíciója alapján. Hasznos szolgálatokat tesznek az aliasok akkor is, ha valamilyen parancsot hajlamosak va-gyunk rosszul gépelni, netán a DOS után nem áll rá a kezünk az ls-re és folyton a dir paran-csot akarjuk végrehajtani — ilyenkor az alias használatával a probléma viszonylag könnyen megoldható. Az érvényben lévo aliasokat úgy listázhatjuk ki, hogy paraméterek nélkül adjuk ki az alias parancsot: hp 22: alias h history hp 23: Új alias megadása hasonlóképpen történik, alias név parancs

formában, ahol név az általunk választott alias, parancs pedig az a parancs vagy parancssoro-zat, amivé az aliast a shell kifejti. Mind már létezo parancsnévre létrehozhatunk aliast, mind új neveket adhatunk. Az elsore egy példa, ha mondjuk a cd parancsot akarjuk „felbovíteni”, és minden katalógusváltás után kií-ratjuk a katalógusban lévo fájlokat: hp 24: alias cd 'cd \!* ; ls' hp 25: alias cd cd !* ; ls h history hp 26: cd FULL-INDEX file1 newfilee2 ravasz temp akarmi newdir nf semmi text file newfile nf1 sendmail.cf hp 27:

A másik megoldásra gyakorlati példa lehet a dir nevu alias, ami a „csökönyös” DOS felhasz-nálók életét könnyítheti meg: hp 29: alias dir 'echo "Ugye ls-t akart mondani...?"; ls -l' hp 30: dir Ugye ls-t akart mondani...? total 378 -rw-rw-rw- 1 demo guest 166262 Aug 23 20:29 FULL-INDEX -rw-rw-rw- 1 demo guest 14 Aug 29 16:53 akarmi -rw-rw-rw- 1 demo guest 530 Aug 29 16:46 file

5 Az alias is azon kifejezések közé tartozik, amit eredeti formájában tartottunk meg, mivel nem létezik igazán jó magyar megfelelõje. (Szokták másnévként, illetve álnévként is emlegetni.)

Page 180: unix kézkönyv

UNIX felhasználói ismeretek

182

-rw-r-xr-x 1 demo guest 18 Aug 23 20:42 file1 drwxrwxrwx 3 demo guest 1024 Aug 23 20:59 newdir -rw-rw-rw- 1 demo guest 18 Aug 23 20:42 newfile -rw-rw-rw- 1 demo guest 18 Aug 23 20:43 newfilee2 -rwxrwxrwx 1 demo guest 11 Aug 30 21:03 nf -rwxrwxrwx 1 demo guest 14 Sep 2 09:51 nf1 -rw-rw-rw- 1 root sys 31 Sep 1 13:45 ravasz -rw-rw-rw- 1 demo guest 13 Aug 29 16:53 semmi lrwxrwxrwx 1 demo guest 20 Aug 23 23:14 sendmail.cf -> /usr/lib/sendmail.cf -rw-rw-rw- 1 demo guest 54 Aug 29 16:57 temp -rw-rw-rw- 2 demo guest 18 Aug 23 20:59 text hp 31:

Mindkét alias igényel némi magyarázatot. Általánosan elterjedt szokás, hogy az "alias-olt" parancsot vagy parancssorozatot szimpla idézojelek közé zárják, elkerülendo hogy a shell be-helyettesítéseket végezzen a tartalmán, vagy hogy a shell metakarakterek (esetünkben a ket-tospont) zavart okozzanak. A felkiáltójel elotti backslash szerepe kevésbé magától értetodo. Ha nem szerepelne ott, akkor a C shell szokásos eseménybehelyettesítési mechanizmusa lép-ne életbe (az ugyanis a szimpla idézojelet se „tiszteli”), s behelyettesítené az alias parancs elotti utolsó parancs argumentumait magába az alias definícióba — általában nem ez az, amit akarunk, mint az alábbi példa is mutatja: hp 35: echo alma korte repa alma korte repa hp 36: alias cd 'cd !*; ls' alias cd 'cd alma korte repa; ls' hp 37:

Az esemény-behelyettesítési mechanizmus elol a backslash alkalmazása védi csak meg a fel-kiáltójel karaktert; ennek hatására a '!*' metakaraktereket csak az alias végrehajtásakor fogja majd a C shell kifejteni és behelyettesíteni, s mivel ekkor a még kifejletlen, alias végrehajtás nélküli cd parancs volt az „elozo” parancs, a kifejtett alias annak a paramétereit fogja megkapni.

Az alias behelyettesítés

A C shell a parancsok önálló szavakra bontása után hajtja végre az aliasok kifejtését: a pa-rancssor elso szavát leellenorzi, hogy nem szerepel-e az alias listában; ha igen, akkor behe-lyettesíti az illeszkedo alias definícióját az argumentum helyébe. Az így behelyettesített új parancssor elso szavát megint összeveti a shell az alias listával, mindaddig, amíg talál illesz-kedo aliasokat. A behelyettesített nevet a shell megjelöli, és ha a következo menetben ugyan-ez az alias kerül elo, akkor nem végzi el az aliaskifejtést, elkerülve a végtelen hurkokat. Emi-att muködoképes az elobbiekben bemutatott cd alias is.

Két olyan megkötés van, amit az aliasok használatánál figyelembe kell vennünk: az egyik, hogy az alias foglalt név, tehát az alias szó maga nem szerepelhet aliasként. Az

Page 181: unix kézkönyv

11. fejezet A C shell

183

alias alias akármi

tehát tilos, ha ilyen parancsot adunk ki, a shell hibaüzenetet ad. (Fordítva muködik a dolog, tehát az alias parancsnak csinálhatunk új aliast, például az alias a alias

legális, mellesleg igen gyakori megoldás, a kevésnél is kevesebbet gépelni akarók örömére, hasonlóan az alias h history

parancshoz.)

A másik megkötés, hogy egy alias definíciójában maga az "aliasolt" név csak egyszer szere-pelhet, többször nem. Ennek is az célja, hogy kiküszöböljék a végtelen hurkokat. Ennek meg-feleloen az alias cmd 'cmd; cmd'

típusú szerkezet tiltott, ha ilyet definiáltunk, végrehajtáskor "Alias loop" hibaüzenetet ad a shell.

Alias törlése

Szükségünk lehet arra is, hogy egy aliast töröljünk, akár azért, mert nincs szükségünk rá, akár mert rosszul definiáltuk. Ezt az unalias paranccsal hajthatjuk végre: hp 21: alias h history hp 22: unalias h hp 23: alias hp 24:

Átirányítások Akárcsak a Bourne shell-nél, itt is lehetoség van a be- és kimenetek átirányítására. Az alábbi-akban szereplo megadási módokat használhatjuk az átirányításkor. Egységesen igaz az, hogy az átirányítás forrásaként illetve céljaként megadott name fájlnéven a C shell szükség esetén mind fájlnév, mind változó, mind parancsbehelyettesítést végrehajt. A C shell másképpen ke-zeli az átirányítást, mint a Bourne shell, ezért a metakarakterek használatánál indokolt a fi-gyelem. <name A bemeneti csatorna a standard input helyett name lesz. >name A kimeneti csatorna a standard output helyett name lesz. Ha name már lé-

tezik, régi tartalma felülíródik. Ha a noclobber shell-változó be van állít-va, és name már létezik, a shell hibaüzenetet ad.

Page 182: unix kézkönyv

UNIX felhasználói ismeretek

184

>& name Mind a kimenet, mind a hibacsatorna name lesz. Ha a noclobber shell-változó be van állítva és name létezik, a shell hibaüzenetet ad.

>>name Additív kimenetátirányítás. A kimeneti csatorna tartalmát name tartalmá-hoz fuzi. Ha name nem létezik, és a noclobber shell-változó be van állít-va, a shell hibaüzenetet ad.

Page 183: unix kézkönyv

11. fejezet A C shell

185

>>& name A kimenetet és a hibacsatornát name tartalmához fuzi. Ha noclobber be van állítva, és name nem létezik, a shell hibaüzenetet ad.

>! name, >&! name, >>! name, >>&! name Ugyanaz mint az elozoek, az eltérés a nem létezo, illetve felülírandó name

fájl kezelésében van. Ha a noclobber shell-változó be van állítva, az ope-rátorok után beszúrt ! karakter hatására érheto el, hogy a shell hibaüzenet küldése helyett végrehajtsa a nem létezo name létrehozását, illetve a léte-zo fájl módosítását. A noclobber shell-változó beállítása esetén ugyanis nem hajtódnak végre a fájlok felülírását eredményezo muveletek.

<<pattern ... pattern Beágyazott input (Here document): a következo sortól addig olvassa a

shell a bemenetet, amíg egy sor elején nem szerepel a pattern minta. A be-olvasott szöveget úgy tekinti, mintha a billentyuzetrol gépelték volna be. A gyakorlatban ez úgy muködik, hogy a shell a lezáró pattern mintáig ter-jedo sorokat egy belso ideiglenes fájlba olvassa be, majd a lezáró minta felismerése után egy pipe-ot nyit meg a beágyazott inputot fogadó prog-ramhoz, és e pipe-ba másolja az ideiglenes fájl tartalmát. Magán a pattern mintán a shell nem hajt végre semmilyen behelyettesítést sem, s a beolva-sott szövegen is csak akkor hajt végre változó- és parancs behelyettesítést, ha a pattern mintát nem védtük le escape karakterrel vagy idézojelekkel.

prog1 | prog2 A prog1 program kimenetét prog2 bemeneti csatornájára köti. prog1 |& prog2 Nemcsak prog1 kimeneti, hanem hibacsatornáját is prog2 bemenetére irá-

nyítja.

A fenti mechanizmusokat megnézve a legfontosabb különbség a Bourne shell-hez képest az, hogy itt nem lehet külön-külön dönteni a kimenet és a hi-

Page 184: unix kézkönyv

UNIX felhasználói ismeretek

186

bacsatorna átirányításáról, hanem vagy a kimenet, vagy a kimenet és a hibacsatorna együttes átirányításáról lehet csak szó.6

Shell-változók A C shell változói, noha alapvetoen ugyanúgy használandóak, mint a standard Bourne shell változói, számos dologban eltérnek azoktól. Tán az egyik legfontosabb különbség, hogy a C shell változói tömbváltozók is lehetnek, s e tömb elemeit egyenként is állíthatjuk, illetve hi-vatkozhatunk rájuk.

A C shell változónevei maximum 20 karakter hosszúak lehetnek, alfanumerikus karaktereket, valamint az aláhúzás jelet tartalmazhatják, s betuvel vagy aláhúzás karakterrel kezdodhetnek.

Értékadás és hivatkozás változókra

A C shell változóihoz a set paranccsal rendelhetünk értéket, illetve e paranccsal kérdezhetjük le az aktuális beállításokat. Ha argumentum nélkül adjuk ki a set parancsot, a már látott mó-don kilistázza a beállított shell-változók értékét. A tényleges értékadás a set var = value

illetve tömbváltozó esetén a set var = ( wordlist )

formában történhet, ahol var a változó neve, value, illetve tömbváltozó esetén wordlist a vál-tozóhoz rendelt érték. Tömbváltozó elemeit kerek zárójelek közé zárva, egymástól szóközzel elválasztva kell megadni, a shell is ilyen formában, de zárójelek nélkül listázza ki oket:

6 Némi „trükközéssel” megoldható a hibacsatorna kizárólagos átirányítása is.

Page 185: unix kézkönyv

11. fejezet A C shell

187

hp 75: set elso = 1; echo $elso 1 hp 76: set masodik = ( 2 harom 4 ot ); echo $masodik 2 harom 4 ot hp 77:

Egy változót az unset paranccsal lehet törölni.

A fenti példákból is láthatóan, akárcsak a Bourne shell-nél, itt is a $var megadással lehet egy változóra hivatkozni. A kétértelmuségek elkerülésére itt is használható és célszeru is használ-ni a ${var} jelölésmódot, ami funkcionálisan ekvivalens az elozovel, de nem ad módot a vál-tozónév és az utána írt karakterek összekeverésére.

Tömbváltozók elemeire hivatkozáskor a $var[index], illetve a ${var[index]} megadás hasz-nálható. (Az index argumentumon szükség esetén változóbehelyettesítést is végrehajt a shell.) Maga az index lehet egyetlen szám, lehet * (ez az összes elemet kijelöli), valamint tól-ig jel-legu megadás is használható: értelemszeruen var[m-n] az m-ediktol az n-edikig terjedo ele-meket jelöli ki, félig üres megadásnál pedig var[-n] az elsotol az n-edikig, míg var[m-] az m-ediktol az utolsóig hivatkozik a tömbváltozó elemeire.

Számos változót csak kapcsolóként használ a shell, a konkrét értékét nem nézi, csak azt, hogy be van-e kapcsolva (set var), vagy sem (unset var). Ilyen jelleguek azok a változók, amelyek a shell viselkedését befolyásolják, mint például a filec, noclobber stb.

Numerikus shell-változók és kifejezések

Mint láttuk, a set paranccsal tudunk egy shell-változónak értéket adni. Ez az érték karakterso-rozat lesz. Ha numerikus értékadást szeretnénk, tehát arra volna szükségünk, hogy az adott shell-változó valamilyen numerikus muvelet eredményét tárolja számként, a set parancs he-lyett az "at" jelet (@) használjuk:

Page 186: unix kézkönyv

UNIX felhasználói ismeretek

188

hp 28: set sum=5+4 # stringkent kezeli hp 29: echo $sum 5+4 hp 30: @ sum=5+4 # az argumentumokat kulon kell irni! @: Badly formed number. hp 31: @ sum=5 + 4 # szamokkent kezeli hp 32: echo $sum 9 hp 33: set sum1=$sum+3 # megint string lesz hp 34: echo $sum1 9+3 hp 35: @ sum2 = $sum + 3 # megint szam lesz 12 hp 36:

A numerikus értékadás parancsának három formája van: @ @ név = kifejezés @ név[index] = kifejezés

Ha csak a @ karakter szerepel parancsként, ez teljesen ekvivalens az argumentumok nélkül kiadott set paranccsal, azaz kilistázza a beállított shell-változókat (nem csak a numerikuso-kat!). A második megadási módra láttunk példát a fentiekben, a harmadik pedig tömbváltozók indexelt elemeinek értékét állítja be, a C nyelvben megszokott szintaxis szerint.

Változóbehelyettesítés

A shell-változókon a C shell mindig megpróbál változóbehelyettesítést végrehajtani, azaz ha valamilyen speciális metakarakter szerepel a változó nevében, az ennek megfelelo behelyette-sítést végrehajtja, s az ennek eredményeképpen adódó új argumentumot helyettesíti be a régi helyére. A behelyettesítések megakadályozására a változónév hivatkozásokban vagy a $ jel elé kell egy backslash karaktert elhelyezni (például \$myvar ), vagy pedig szimpla idézojelek közé kell zárni a hivatkozott változó nevét ( '$myvar' ).

Page 187: unix kézkönyv

11. fejezet A C shell

189

A C shell az alábbi speciális változóbehelyettesítési konstrukciókat használja: $#name ${#name} A name változóban lévo szavak számát (azaz a tömbváltozó elemeinek

számát) adja meg. $0 Annak a fájlnak a nevét helyettesíti be, ahonnan a bemenetet olvassa. $n, ${n} Az n-edik pozicionális paraméter. (Egyenértéku a $argv[n] megadással.) $* Az összes pozicionális paraméter ($0 kivételével). (Egyenértéku a

$argv[*] megadással.)

A fenti mechanizmusokra használhatóak az alábbi eseménymódosítók is: :e, :h, :t, :r, :q, és :x, valamint a :gh, :gt és :gr. (Gyakran használatosak például a pozicionális paraméterként átadott fájlnevek „megtisztítására”, a katalógus és/vagy kiterjesztések levágására.)

Az alábbi behelyettesítések esetén nem lehet eseménymódosítókat használni. $?var, ${?var} Ha var be van állítva, az 1 értéket helyettesíti be, ha var nincs beállítva, a

0 értéket. $?0 Az 1 értéket helyettesíti be, ha a bemeneti fájl ismert, 0 értéket, ha nem. $$ A futó folyamat folyamatazonosítóját adja vissza. $< A standard bemenetrol beolvas egy sort (további behelyettesítést nem hajt

rajta végre), és azt helyettesíti be.

Környezeti- és shell-változók a C shell-ben

A Bourne és a Korn shell változókezeléséhez képest a C shell egy igen bonyolult, mondhatni túlbonyolított változókezelési módszert alkalmaz. Eloször is, a C shell változói két csoportra vannak osztva: közönséges shell-változókra (shell variables), illetve környezeti változókra (environment variables). A környezeti változókat (ezeket rendszerint nagybetuvel írják) a C shell automatikusan exportálja a benne meghívott programoknak, míg a shell-változókat nem (ha shell-változót akarunk exportálni, akkor a setenv parancsával tehetjük meg).

Az alábbi két példa a normál, illetve a környezeti shell-változókat mutatja (figyeljük meg a path és a PATH eltéro szintaxisát): hp 1: set # normal valtozok argv () autologout 60 cwd /users/demo history 20 home /users/demo noclobber path (/bin /usr/bin /usr/contrib/bin /usr/local/bin .) prompt hp !: savehist 20 shell /bin/csh status 0 system hp term sun-cmd

Page 188: unix kézkönyv

UNIX felhasználói ismeretek

190

A környezeti változók ugyanekkor: hp 2: setenv # kornyezeti valtozok HOME=/users/demo PATH=/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:. LOGNAME=demo TERM=sun-cmd SHELL=/bin/csh MAIL=/usr/mail/demo MANPATH=/usr/man:/usr/contrib/man:/usr/local/man TZ=MET-1METDST

A C shell ezenkívül egyes fontos változókat megkülönböztetetten kezel, s ezeket mind nor-mál, mind környezeti változóként nyilvántartja. E shell-változók közül néhány (zárójelben a megfelelo környezeti változók neve): user (USER), home (HOME), term (TERM), path (PATH), shell (SHELL) stb. Néhány ilyen változópárnál a két változó közt semmi kapcsolat nincs, a shell indulásakor azo-nos értékre állítja be oket a rendszer (még ez se törvényszeru), a továbbiakban teljesen füg-getlenek egymástól, s ha „szinkronizálni” akarjuk oket, nekünk kell kiadni a megfelelo paran-csokat.

set var=$VAR

Page 189: unix kézkönyv

11. fejezet A C shell

191

hatására a var shell-változó felveszi környezeti változópárja (VAR) értékét, míg a setenv VAR $var

parancs hatására a VAR környezeti változót frissíthetjük fel a normál var shell-változó értéké-vel. Ilyen jellegu változópárt alkot például a shell és a SHELL: hp 7: set shell=/bin/ksh # shell valtozot modosit hp 8: echo $shell $SHELL /bin/ksh /bin/csh hp 9: setenv SHELL /bin/sh # korny.valtozot modosit hp 10: echo $shell $SHELL /bin/ksh /bin/sh

A változópárok másik csoportjánál viszont, ha a felhasználó megváltoztatja a shell-változót, a megfelelo környezeti változó automatikusan felfrissítodik; ugyanakkor fordított irányban ez nem áll fenn. Ebbe a csoportba tartoznak a user (USER), a home (HOME) és a term (TERM) változópárok, valamint – némiképp kakukktojásként – egyes C shell implementáci-ókban a cwd (PWD) változók is: hp 21: echo $term $TERM sun-cmd sun-cmd hp 22: set term=vt100; echo $term $TERM vt100 vt100 hp 23: setenv TERM sun-cmd; echo $term $TERM vt100 sun-cmd hp 24:

Végül – csak hogy az eddig se egyszeru modell még követhetetlenebb legyen – van egyetlen-egy olyan változópár, a path (PATH), ahol a normál- és a környezeti shell-változók között kétirányú kapcsolat áll fenn, azaz bármelyik változtatásakor automatikusan frissítodik a má-sik is; ehhez képest már üdíto ráadásként hat, hogy e két változónak a szintaxisa is eltéro, a PATH a UNIX alatt megszokott módon, kettospontokkal választja el az egyes elemeket (hi-szen ezt a változót dolgozzák fel az egyéb programok), a path változóban viszont szóközzel elválasztva vannak felsorolva a katalógusok (ahogy az egy jólnevelt többelemu C shell-változóhoz illik)... hp 65: echo $path; echo $PATH /bin /usr/bin /bin:/usr/bin hp 66: set path = ( $path /etc ); echo $path; echo $PATH /bin /usr/bin /etc /bin:/usr/bin:/etc hp 67: setenv PATH $PATH\:$HOME/bin; echo $path; echo $PATH /bin /usr/bin /etc /users/demo/bin /bin:/usr/bin:/etc:/users/demo/bin hp 68:

(Figyeljük meg, hogy az utolsó példában a 67-es sorszámú parancsnál a kettospont karaktert is le kellett védeni a backslash karakterrel, mert különben eseménymódosító metakarakter-ként kezelte volna a shell.)

A C shell belso változói

Page 190: unix kézkönyv

UNIX felhasználói ismeretek

192

Az alábbiakban a C shell belso shell-változóit tekintjük át, azokat, amelyeket maga a shell de-finiál és használ. Az alábbi lista szükségképpen nem teljes, mert a C shell implementációk között is jelentos különbségek vannak, ugyanakkor az is elofordulhat, hogy az általunk hasz-nált implementációban nem szerepel valamelyik itt szereplo változó. A változók jelentos része logikai változó (boolean), amelyeknél a konkrét érték nem érdekes, csak az, hogy egyáltalán be vannak-e állítva, vagy sem. (Mint már láttuk, egy logikai változót (példának okáért a noclobber változót) a

set noclobber paranccsal lehet „bekapcsolni”, az

unset noclobber paranccsal pedig „kikapcsolni”.) argv E változó a parancssori argumentumokat tartalmazza, úgy, ahogy a hívó

shell azokat átadta. autologout Ha e változó értéke nem nulla, akkor a megadott (percekben mért) ido el-

teltével, ha azalatt nem használta a felhasználó a terminált, kilépteti a fel-használót a rendszerbol. E szolgáltatást vagy a 0 érték beállításával, a

set autologout=0 paranccsal, vagy az unset autologout paranccsal lehet letiltani. cdpath A path változóhoz hasonló, de ez a cd (valamint a chdir és popd) parancs

végrehajtásában nyújt könnyebséget. Ha a cd parancs argumentuma rela-tív elérési útvonallal van megadva (nem a '/' jellel kezdodik) és az aktuális katalógus alatt nem található ilyen nevu katalógus, akkor a cdpath válto-zóban szereplo katalógusokban keresi a megnevezett alkatalógust, s ha va-lahol talál ilyet, oda vált. Például ha demo néven jelentkeztünk be és a /users/demo katalógusban vagyunk, s a cdpath változót a

set cdpath = ( ~/bin ~/local ) paranccsal állítottuk be, akkor ha kiadjuk a cd tmp parancsot, a shell eloször a /users/demo/tmp katalógust keresi; ha

ilyet nem talált, akkor a /users/demo/bin/tmp, végül pedig a /users/demo/local/tmp katalógust fogja keresni.

cwd A munkakatalógus elérési útvonalát tartalmazza. Minden egyes cd parancs után frissítodik az értéke. Bejelentkezéskor a HOME változó értékét tar-talmazza (ami viszont a /etc/passwd fájlban van megadva).

filec Logikai változó; bekapcsolása esetén lehetové teszi, hogy a már ismerte-tett módon használjuk a fájlnév kiegészítési mechanizmust (CTRL-D, il-letve ESC).

history Az eseménypufferben tárolt események (elozo parancsok) száma. home A felhasználó alapkatalógusát adja meg. ignoreeof Logikai változó. Ha be van kapcsolva, akkor a CTRL-D hatására nem le-

het kilépni a shell-bol, csak az exit, illetve login shell esetén a logout pa-ranccsal.

mail Azon fájlok listája, amelyeket a C shell postafájlként kezel; ha bármelyik mérete megváltozik, a C shell jelzi, hogy új levél érkezett. Ha az elso ele-

Page 191: unix kézkönyv

11. fejezet A C shell

193

me e változónak numerikus érték, a C shell az itt (másodpercben) mega-dott idoközönként ellenorzi le a postafájlokat.

noclobber Logikai változó. Megbízható mentoöv a kezdo UNIX felhasználók számá-ra: ha be van állítva a set paranccsal, akkor meggátolja a fájlok átirányítá-sok révén bekövetkezo módosítását. Természetesen a fájlok ekkor is mó-dosíthatóak, de külön jelezni kell a '!' karakter használatával, hogy „ko-molyan gondoltuk” a dolgot.

noglob Logikai változó. Beállítása esetén letiltja a fájlnév behelyettesítéseket. Shell script-ekben lehet hasznos, ha gondoskodni akarunk arról, hogy az átadott fájlnevek ne essenek áldozatául újabb nem várt behelyettesítések-nek.

nonomatch Logikai változó. Beállítása esetén, ha egy fájlnév behelyettesítés nem jár eredménnyel, a behelyettesíteni próbált mintát adja vissza, nem pedig hi-baüzenetet.

notify Logikai változó. Beállítása esetén a háttérben indított folyamatok befeje-zésérol rögtön értesítést kapunk, egyébként csak a soron következo prompt kiírása elott írja ki a háttérfolyamatok befejeztét.

path A parancsok keresési útvonala. Az aktuális katalógusra a '.' karakterrel, il-letve üres elemmel lehet hivatkozni. A shell indulásakor a PATH környe-zeti változóból kapja értékét, ha pedig változik, PATH is követi a módo-sulásokat.

prompt A shell által kiírt parancspromptot definiálja. Nem interaktív shell-ek ese-tén, tehát amik shellscript-et futtatnak, vagy nem terminálról lettek elindít-va, prompt értéke nincs beállítva. A prompt értékét a

if ($?prompt == 0) feltétellel lekérdezve lehetoségünk nyílik arra, hogy azokat a parancsokat, amelyek nem-interaktív környezetben feleslegesek, ne futtassuk le, így jelentosen gyorsítható a shell-ek indítása.

savehist A következo bejelentkezésre átmentett eseménypuffer mérete (sorokban). Az elmentett parancsokat a ~/.history fájlban tárolja a rendszer, s a fel-használó következo belépésekor ezekre is tud hivatkozni.

shell Annak a parancsértelmezonek a nevét tartalmazza, amelyik a shellscript-eket végrehajtja.

status A legutolsó parancs visszatérési értéke. A szokásos konvenció szerint a shell beépített parancsai 0 értéket adnak vissza sikeres lefutás esetén, 1-et sikertelenség esetén, valamilyen abnormális esemény bekövetkeztekor pe-dig oktális 200 adódik hozzá.

verbose Logikai változó. Az eseménybehelyettesítés megtörténte után kiírja a pa-rancsot a képernyore. Hibakeresésnél tehet jó szolgálatokat.

Parancsbehelyettesítés

Page 192: unix kézkönyv

UNIX felhasználói ismeretek

194

A Bourne shell-hez hasonlóan a C shell is lehetoséget ad arra, hogy egy parancs kimenetét egy másik parancs argumentumlistájába fuzzük (parancs behelyettesítés). A szintaxis ugyan-az, mint a Bourne shell-nél, azaz a behelyettesítendo parancsot argumentumaival együtt a backgrave accent (`..`) karakterek közé zárjuk: hp 29: set hostname=`uname -n` hp 30: echo $hostname hp hp 31:

Fájlnév behelyettesítés Az alábbi metakarakterek fájlnév behelyettesítéskor játszanak szerepet. Minden olyan argu-mentumot, amelyben az alábbi metakarakterek szerepelnek, a C shell behelyettesítendo fájl-névnek tekint, s az alábbi szabályok alapján próbálja a megadott (vagy annak hiányában az aktuális) katalógusban lévo fájlnevek listájára illeszteni. Ha talált egy vagy több olyan fájlne-vet, ami illeszkedik a keresett mintára, akkor az argumentum helyére ezeket a fájlneveket fog-ja behelyettesíteni. Ha az illesztés sikertelen volt, a nonomatch shell-változó beállításától függoen vagy hibajelzést ad a shell, vagy változatlanul hagyja az eredeti, fájlnév behelyettesí-tési metakaraktereket tartalmazó argumentumot: hp 67: ls x*; echo $status No match. 1 hp 68: set nonomatch; ls x*; echo $status x* not found 2 hp 69:

A fenti példában eloször beállítatlan nonomatch változóval próbáltunk kilistázni nemlétezo fájlokat, a shell a 'No match.' hibaüzenetet adta, s a parancs visszatérési értéke 1 volt, ami a beépített parancs rendellenes lefutását jelzi; ha a nonomatch változót bekapcsoltuk, nem a shell adott hibaüzenetet, hanem az ls parancs, jelezvén, hogy nem találta a szó szerint értel-mezett argumentumnak megfelelo x* fájlt. A visszatérési érték ez esetben 2 volt, amit az ls parancs állított be a sikertelen keresés hatására.

Az alábbiak a csh által értelmezett fájlnév behelyettesíto metakarakterek: ? Bármely karakterre illeszkedo „dzsóker karakter”. * Akármennyi tetszoleges karakterre illeszkedik (nulla darab karakterre is!). [...] Karakterosztály definíció: egyetlen olyan karakterre illeszkedik, amelyik a

szögletes zárójelek között szereplo karakterek valamelyikével azonos. A karakterek megadása történhet „tól-ig” formában is, pl [a-z] bármelyik kisbetu karakterre illeszkedik.

Az alábbi metakarakterek nem szerepelnek a Bourne shell-nél:

Page 193: unix kézkönyv

11. fejezet A C shell

195

{..,..} A karakterosztály fogalmának kibovítése. A kapcsos zárójelek között tet-szoleges hosszúságú karaktersorozatok szerepelhetnek, ezeket vesszovel elválasztva kell felsorolni. Az ily módon megadott minta értelemszeruen nem egy karakterre, hanem tetszoleges számú karakterre illeszkedhet. Pél-dául az {a,alfa,beta,gamma}bc minta illeszkedni fog az abc, alfabc, betabc és gammabc fájlnevekre egyaránt. A kapcsos zárójelek egymásba is ágyazhatóak, s használhatóak benne a '?' és '*' dzsókerkarakterek is.

~ A megnevezett felhasználó alapkatalógusának (home directory) neve he-lyettesítodik be. Ha például rendszerünkben a felhasználók alapkatalógu-sai a /users katalógus alatt találhatóak, akkor a ~peter megadással a /users/peter név fog behelyettesítodni. Ha a tilde karakter után rögtön egy slash karakter szerepel, akkor a saját alapkatalógusunk fog behelyettesí-todni, így demo néven dolgozva a ~/bin/proba a /users/demo/bin/proba fájlnévre fog illeszkedni.

Kifejezések és operátorok Az alábbi pontokban a numerikus- és string-kifejezések megadásakor használható operátoro-kat ismertetjük. Vigyázzunk, hogy az egyes változókat, muveleti jeleket és zárójeleket a shell által elkülönítheto módon, azaz szóközökkel elválasztva írjuk. Néhány muveleti jelet ugyan ennek hiányában is el tud különíteni, de az esetek nagy többségében nem, ezért legjobb, ha mindent külön-külön argumentumként adunk meg.

Aritmetikai operátorok

() Zárójelezés, a kiértékelési sorrend megváltoztatására. +, _, *, / Összeadás, kivonás, szorzás és osztás. % Maradékos osztás. ^ Bitenkénti kizáró VAGY (excl.OR). ~ Unáris egyes komplemens. >>, << Jobbra, illetve balra léptetés. &, | Bitenkénti ÉS (AND) és VAGY (OR).

Logikai (relációs) operátorok

== Egyenlo. Mind stringekre, mind numerikus értékekre használható. != Nem egyenlo. Mind stringekre, mind numerikus értékekre használható. ! Negálás.

Az alább következo logikai operátorok esetén mindig zárójelezni kell az operandusokat és az operátort.

Page 194: unix kézkönyv

UNIX felhasználói ismeretek

196

>, >=, <, <= Nagyobb, nagyobb-egyenlo, kisebb, kisebb_egyenlo. Csak számokra. &&, || Logikai ÉS (AND) és VAGY (OR).

Értékadási operátorok

Az alábbi operátorokkal lehet változóknak értéket adni. = Értékadás. +=, -=, *=, /=, %=, ^= Ezen operátorok egyfajta tömörített megadást tesznek lehetové, ha az ér-

tékadás bal oldala és az elso jobboldali operandus azonos; például az a += b megadás megfelel az a = a + b muveletnek. A többi értékadási operátor hasonlóképpen értelme-

zendo.7

Postfix operátorok

A C nyelvben szereplo mechanizmushoz hasonlóan, itt is léteznek postfix operátorok, a ++ és a --, melyek gyakorlatilag a var += 1 illetve a var -= 1 konstrukciónak felelnek meg, azaz a megnevezett var változó értékét eggyel növelik vagy csökkentik. Így az alábbi három szerke-zet egyenértéku (figyeljük meg, hogy a postfix operátornál nem szükséges a $ jel kitétele a változóra hivatkozáshoz): @ i++ @ i = $i + 1 @ i += 1

Fájl- és parancs-teszt operátorok

A fájlokkal kapcsolatos tesztekre külön operátorcsoportot definiál a C shell. A feltételek tel-jesülése esetén igaz (1), egyébként hamis (0) logikai értéket adnak vissza. Nem létezo, vagy valamilyen okból hozzáférhetetlen fájlok tesztelése esetén mindegyik alábbi operátor hamis értéket ad vissza. -r file Igaz, ha a felhasználónak olvasási joga van a fájlra. -w file Igaz, ha a felhasználónak írási joga van a fájlra. -x file Igaz, ha a felhasználónak végrehajtási (keresési) joga van a fájlra. -e file Igaz, ha a fájl létezik. -o file Igaz, ha a felhasználó a fájl tulajdonosa. -z file Igaz, ha a fájl üres (nulla hosszúságú).

7 A léptetõ és a bitmûveletekre nincs ilyen rövidített írásmód.

Page 195: unix kézkönyv

11. fejezet A C shell

197

-f file Igaz, ha a fájl közönséges állomány (nem katalógus, perifériameghajtó, stb.).

-d file Igaz, ha a fájl katalógus.

Az alábbi operátorral parancs(ok) visszatérési értékét lehet lekérdezni. { command } Ha a kapcsos zárójelek közti parancs, illetve parancssorozat sikeresen fu-

tott le, igaz (1) értéket ad vissza, egyébként hamisat (0). Nagyon fontos emlékeznünk rá, hogy ez a kiértékelési mód ellentétes magával a parancs által adott visszatérési értékkel, hiszen a UNIX-os konvenció szerint a si-keresen lefutott programok 0 értékkel lépnek ki, bármi más visszatérési ér-ték valami problémát jelez. Ha tehát valami miatt a parancs tényleges visszatérési értékére vagyunk kíváncsiak (exit status), azt a status shell-változóból tudhatjuk meg.

Vezérlési szerkezetek A C shell beépített vezérlési szerkezetei teszik lehetové, hogy shell-programokat futtatva (il-letve korlátozott mértékben a parancssorból végrehajtva is) a megfelelo feltételek teljesülése-kor eltéro parancságak hajtódjanak végre, vagy ciklikusan ismétlodjön egyes kódrészletek végrehajtása. A C shell által biztosított vezérlési szerkezetek funkcionálisan igen hasonlóak a Bourne (és a Korn) shell megfelelo mechanizmusaihoz, az elso látásra szembetuno különbség a szintaxisban mutatkozik: a C shell vezérlési szerkezetei lehetoség szerint a C nyelv megfe-lelo parancsainak megadási módját követik.

if-then-endif

Ez a szerkezet a feltételes elágazások kialakítására jó. Szintaxisa a következo: if (expr1) then cmdlist1 else if (expr2) then cmdlist2 else cmdlist3 endif

A fenti leírásban expr1 tetszoleges kifejezés lehet (beleértve parancsok visszatérési értékének kielemzését is), a cmdlistn megadás pedig tetszoleges számú parancsból álló sorozatokat je-löl. Ha expr1 igaz, az elso else ágig terjedo programrészt (cmdlist1) hajtja végre a shell; más-különben, ha expr2 igaz, akkor a cmdlist2 parancslistát, egyébként pedig a cmdlist3 parancsa-it. Mind az else if, mind az else ágak opcionálisak, else if pedig tetszoleges számban szerepel-het. A legtöbb csh implementációnál vigyázni kell arra, hogy az if ... then, illetve az else if,

Page 196: unix kézkönyv

UNIX felhasználói ismeretek

198

else és endif szintaktikai elemek külön sorban szerepeljenek, a köztük lévo programrészekkel ne keveredjenek. A fenti parancs leegyszerusített változata az if (expr) cmd

megadási mód, ahol egyetlen parancs, cmd hajtódik végre expr igaz volta esetén (sem pipe, sem parancssorozat, sem zárójelezett parancsok nem megengedettek ez esetben, s az egész parancsnak egy sorban kell szerepelnie8).

switch

A switch vezérlési szerkezet a többirányú elágaztatás céljait szolgálja. Szintaxisa a követke-zo: switch (word) case pattern1) cmdlist1 ... breaksw ... case patternm) cmdlistm ... breaksw default: cmdlistn ... breaksw endsw A switch szerkezet végrehajtásakor a shell sorra összehasonlítja a word argumentumot a case sorokban szereplo pattern mintákkal, s amelyikre illeszkedik, az ahhoz tartozó cmdlist paran-csot vagy parancssorozatot végrehajtja. A word szócskán parancs- és változó-behelyettesítést végez a shell, a pattern mintákon fájlnév- és változó-behelyettesítéseket, ezért megadhatunk a mintában *, ? és [..] metakaraktereket is. Ha egyik minta se illeszkedik a word argumentumra, a default: ághoz tartozó parancs(ok) hajtódnak végre.

Ha az egyes ágak végén a breaksw kulcsszó szerepel, akkor a vezérlés a teljes switch szerke-zetet lezáró endsw kulcsszó utánra kerül, ellenkezo esetben a soronkövetkezo mintára adódik át. Formai megkötés, hogy a case és a default utasítások a sor elején kell hogy kezdodjenek.

8 Logikailag kell egy sorban szerepelniük, tehát ha az olvashatóság úgy kívánja, a backslash karakterrel levédve az újsor karaktereket, több sorba is tördelhetjük a parancsot.

Page 197: unix kézkönyv

11. fejezet A C shell

199

foreach

E parancs ciklusszervezésre alkalmas, szintaxisa az alábbi: foreach var (wordlist) ... end A parancs muködése, a formai eltérésektol eltekintve azonos a Bourne shell for parancsával: a var változó értéke sorra felveszi a wordlist többelemu lista egyes elemeinek értékét, és a le-záró end kulcsszóig terjedo részt ezzel az értékkel hajtja végre. Az elozoekhez hasonlóan, a foreach és az end elemeknek külön sorban kell szerepelniük. Ha a ciklustörzsön belül arra van szükség, hogy ido elott lépjünk ki, a break utasítással tehet-jük meg, mely az ot tartalmazó legbelso ciklusból léptet ki. A kilépés után a break parancsot tartalmazó sor többi részét hajtja végre a shell, így lehetoség van arra, hogy több break kulcsszó egymás után írásával egymásba ágyazott ciklusokból lépjünk ki. Ha nem a ciklusból való kilépésre, hanem a következo ciklus ido elotti kezdésére van szük-ség, azt a continue paranccsal érhetjük el. Ennek hatására az ot körülvevo legbelso ciklusfej újra kiértékelodik, és az új értékkel folytatódik a végrehajtás. E vezérlési szerkezet a parancssorból is kiadható, ilyenkor a for ... sor után az újsor karakter begépelésekor kérdojel jelenik meg (másodlagos prompt), jelezvén, hogy a shell további be-vitelre vár.

while

Szintén ciklusszervezo utasítás, az alábbi szintaxissal: while (expr) ... end

Mindaddig, amíg az expr kifejezés kiértékelésekor igaz logikai értéket kapunk, az end kulcs-szóig terjedo ciklustörzs végrehajtódik. A foreach parancshoz hasonlóan használható itt is a break és a continue parancs a ciklus ido elotti megszakítására, illetve továbbléptetésére. A while és az end elemeknek itt is külön sorban kell szerepelniük. E vezérlési szerkezet is hasz-nálható interaktív módon, a parancssorból.

goto

A goto label parancs használható feltétel nélküli elágazások megvalósítására. Hatására a ve-zérlés a label: mintát tartalmazó sor utáni sorra kerül.

Page 198: unix kézkönyv

UNIX felhasználói ismeretek

200

A parancsvégrehajtás folyamata Az alábbiakban azt a folyamatot tekintjük át, amelynek során egy általunk begépelt parancs-sorozatot végrehajt a shell.9

Ha a végrehajtandó parancs a C shell egy beépített parancsa, a shell felismeri azt, és rögtön végrehajtja. Ha nem belso parancsról van szó, a shell a megadott nevu, végrehajtási jogokkal rendelkezo fájlt fogja keresni az állományrendszerben. Ha a fájlnév abszolút elérési útvonal-lal van megadva, tehát a '/' karakterrel kezdodik, a keresési útvonal egybol adott; ha relatív el-érési útvonallal van a fájlnév megadva, a shell a path változóban szereplo katalógusokban fogja keresni a fájlt. (E keresés felgyorsítására a csh belso táblákban, az ún. hash-elési eljá-rással indexelve nyilvántartja a keresési útvonalakon található összes végrehajtható fájlt. E belso táblákat a rehash paranccsal tudjuk felfrissíteni, az unhash paranccsal pedig a haszná-latát letiltani.)

Ha a parancsnév nem tartalmaz katalógus részt, a shell összeveti a nevet az érvényes aliasok listájával; ha valamelyik alias névvel egyezik, a shell kifejti az aliast a definíció szerint, s az így adódó új névvel, a kifejtett alias elso argumentumával dolgozik tovább, ha szükséges, újabb alias kifejtéseket hajtva végre. Az alias-kifejtéskor a parancsnéven kívüli keletkezett pótlólagos argumentumok befuzodnek az eredeti argumentumlistába.

Ha a shell végül megtalálta a kívánt fájlt a megfelelo végrehajtási jogokkal, elindít egy új fo-lyamatot, és ennek az új folyamatnak adja át végrehajtásra a futtatandó program nevét és ar-gumentumait (pontosabban szólva ezt az új folyamatot fogja felülírni a futtatandó program-mal). A futtatandó program típusától függoen négyféle módon történhet a fájl végrehajtása.

Ha a futtatandó program szabványos, úgynevezett a.out formátumú bináris végrehajtható ál-lomány, a kernel felülírja vele az új folyamatot és rögtön végrehajtja.

Ha a fájl nem bináris, hanem szövegfájl, és a '#!' karakterekkel kezdodik, akkor a '#!' karakte-rek utáni argumentummal megnevezett programot fogja a

9 Az eseménybehelyettesítés megtörténte után.

Page 199: unix kézkönyv

11. fejezet A C shell

201

kernel a végrehajtó programnak tekinteni, elindítja azt az új folyamat helyén, argumentum-ként átadva neki a végrehajtandó fájl nevét.

Ha a fájl szövegfájl ugyan, de nem a '#!' karakterekkel kezdodik, a fájl elso karakterétol füg-goen megint csak két eset lehetséges: ha a fájl elso karaktere a '#' karakter, az új folyamat he-lyén egy C shell indul el, és az hajtja végre a fájlt; bármi más esetben a standard Bourne shell fog elindulni.

Jobkezelés Amikor a parancssorból útjára bocsátunk egy parancsot vagy parancssorozatot, a csh egy úgynevezett jobazonosítót (job id) rendel hozzá. Ha nem háttérfolyamatként indítottuk a parancso(ka)t, ebbol semmit se látunk. Ha viszont háttérfolyamatot futtatunk (a parancso(ka)t a '&' karakterrel zárjuk le), a prompt megjelenésekor a csh szögletes zárójelek között kiírja a jobazonosítót, utána pedig az ehhez a jobhoz tartozóan elindított összes folyamat folyamata-zonosítóját: hp 21: find / -name semmi -print & [1] 4354 hp 22:

A kurrens jobok listáját a jobs paranccsal tekinthetjük meg, a listában '+' jel jelöli a legutoljá-ra megállított, vagy háttérbe helyezett jobot, '-' jellel pedig a megelozo jobot; ha a kurrens job megszunik vagy elotérbe kerül, ez lép a helyére.

Ha egy elotérben futó folyamatot szeretnénk háttérbe helyezni, a suspend funkcióhoz rendelt karakterrel (ez rendszerint a CTRL-Z) tudjuk az elotérben futó folyamatot felfüggeszteni; ez-után pedig a megfelelo parancsokkal tudjuk folytatni a futását, háttérbe helyezni, végleg leál-lítani, stb.

A jobokon az fg, bg, kill, stop és % parancsokkal tudunk muveleteket végezni. Általában igaz az, hogy egy jobra való hivatkozás a % jellel kezdodik; az önmagában álló % jel a kur-rens jobra hivatkozik.

Page 200: unix kézkönyv

UNIX felhasználói ismeretek

202

%, %+, %% A kurrens job. %- Az elozo job. %job E megadásnál job akár a konkrét jobazonosító lehet (például kill %3),

akár az adott jobra egyértelmuen jellemzo parancssori részlet: például a fg %find parancs elotérbe fogja hozni az elozoleg háttérben futtatott find

parancsot.

A jobkezelo parancsok az alábbiak: bg [%job] Az aktuális, illetve paraméterként megadott jobot a háttérben futtatja. fg [%job] A megadott, illetve paraméter hiányában az aktív jobot elotérbe hozza és

ott futtatja. jobs [-l] Az éppen futó, jobvezérlo parancsokkal elérheto jobokat listázza ki. -l ha-

tására a folyamatazonosítókat is kiírja. kill [-sig][%job] A TERM (leállító), illetve megadása esetén valamelyik másik sig szignált

küldi ki a megnevezett folyamatnak. A jobazonosítóval (%job) hivatkoz-hatunk a leállítandó folyamatra. A -l opció hatására kilistázza a küldheto szignálok listáját. A szignál akár számmal, akár névvel megadható.

stop [%job] A megadott, ennek hiányában pedig az aktuális jobot leállítja.

A C shell beépített parancsai Az alábbiakban a C shell beépített parancsait tekintjük át. Ezek olyan parancsok, amik a fel-használó számára megkülönböztethetetlenek a szokványos UNIX parancsoktól, a különbség abban rejlik, hogy ezek a shell-be beépített parancsok, nem egy másik UNIX parancsot hív meg a shell, amikor használjuk oket. : Üres parancs. Hatására semmi tevékenység nem történik. Rendszerint fel-

tétel-ágak kitöltésénél használatos.

Page 201: unix kézkönyv

11. fejezet A C shell

203

alias [name [def]] A def definíciót rendeli hozzá a name névhez. name nem lehet azonos az alias, illetve unalias szóval. Argumentum hiányában a létezo alias definí-ciók íródnak ki.

bg [%job] Az aktuális, illetve paraméterként megadott jobot a háttérben futtatja. break A legbelso foreach vagy while hurkon kívülre ugrik és onnan folytatja a

végrehajtást. breaksw switch parancsból lép ki, az endsw kulcsszó utáni részen folytatva a vég-

rehajtást. case label: végrehajtási ág a case vezérlési szerkezetben. cd dir, chdir dir A dir katalógusba vált. Ha dir relatív elérési úttal megadott katalógusnév,

és a kurrens katalógus alatt nem található, akkor a cdpath változó által megadott katalógusok alatt is keresi.

continue A pillanatnyi pontot körülvevo legbelso while vagy foreach ciklusra ug-rik, s annak elejérol folytatódik a program futása.

default: A switch vezérlési szerkezet alapértelmezésu ága. Ha a többi ágra ugrás feltétele nem teljesült, az e szócska után következo kód hajtódik végre.

dirs [-l] A katalógus-verem tartalmát listázza ki, a legutolsónak beírt elemmel kezdve. A -l opció hatására a teljes elérési út nevet írja ki, a ~ rövidítés megszunik.

echo [-n] list A list argumentumokat a standard kimenetre írja, szóközzel elválasztva. A kiírást újsor karakterrel zárja, kivéve ha a -n opciót is megadtuk.

eval arg .. Az argumentumokat beolvassa a shell-be és az eredményül adódó paran-csokat végrehajtja. Olyankor szokás használni, ha parancs- vagy változó-behelyettesítéssel generált parancsokat szeretnénk végrehajtani, ugyanis egyébként a parancssor feldolgozása már a parancsbehelyettesítés elott megtörténik.

exec cmd A cmd parancs(oka)t az aktuális shell megszüntetésével, annak helyén hajtja végre.

exit [(expr)] Megszunik a shell, ha expr definiált, annak értékével, egyébként pedig a status változó értékét fölvéve.

Page 202: unix kézkönyv

UNIX felhasználói ismeretek

204

fg [%job] A megadott, illetve paraméter hiányában az aktív jobot elotérbe hozza és ott futtatja.

foreach var ( wordlist ) cmdlist end Ciklusszervezo vezérlési szerkezet. var sorra felveszi wordlist elemeinek

értékét, és a ciklustörzset ezzel az értékkel hajtja végre. A break pa-ranccsal ido elott ki lehet lépni az egész ciklusszerkezetbol, a continue pedig soronkívül a ciklusfejjel folytatja, a következo wordlist elemet be-helyettesítve.

goto label A parancsvégrehajtás a label: szöveggel kezdodo sor után folytatódik. Ha szükséges, a label címkén a shell végrehajtja a parancs- és fájlnév behe-lyettesítéseket, és az így adódó címkét keresi. Ciklusba beugrani tilos, akár while, akár foreach ciklusról van is szó.

history [-hr] [n] Kilistázza az eseménypuffer tartalmát, azaz a feljegyzett elozo parancso-kat. n a kilistázandó események számát adja meg (ha nem adtunk meg ér-téket, a history változó által beállított értéket veszi). -r hatására fordított sorrendben listázza ki az eseményeket, míg -h az eseményszám nélkül.

if (expr1) then cmdlist1 else if (expr2) then cmdlist2 else cmdlist3 endif Ha expr1 igaz, az elso else ágig terjedo programrészt (cmdlist1) hajtja

végre a shell; máskülönben ha expr2 igaz, akkor a cmdlist2 parancslistát, egyébként pedig a cmdlist3 parancsait. Mind az else if, mind az else ágak opcionálisak, else if pedig tetszoleges számban szerepelhet.

A fenti parancs leegyszerusített esete az if (expr) cmd változat, ahol egyetlen parancs, cmd hajtódik végre expr igaz

teljesülése esetén (sem cso, sem parancslista, se zárójelezett parancsok nem megengedettek).

jobs [-l] Az éppen futó, jobvezérlo parancsokkal elérheto jobokat listázza ki. -l ha-tására a folyamatazonosítókat is kiírja.

kill [-sig] [pid] [%job] kill -l A TERM (leállító), illetve megadása esetén valamelyik másik sig szignált

küldi ki a megnevezett folyamatnak. Akár folyamatazonosítóval (pid), akár a jobazonosítóval (%job) hivatkozhatunk a leállítandó folyamatra. A -l opció hatására kilistázza a küldheto szignálok listáját. A szignál akár számmal, akár névvel megadható.

limit [-h] [resource] [max-use] Az aktuális folyamat, vagy az általa indított folyamatok eroforrás igényét

maximálja. Ha a max-use értéket nem adjuk meg, a pillanatnyi beállítást

Page 203: unix kézkönyv

11. fejezet A C shell

205

írja ki; ha az eroforrást (resource) se nevezzük meg, az érvényes összes határértéket kilistázza.

-h Hatására az úgynevezett "hard limitet" listázza ki a shell, azokat az értékeket, ameddig a pillanatnyi beállításokkal elmehetünk. Hard limi-tet csak privilégizált felhasználó növelhet meg.

A beállítható eroforrások és neveik erosen rendszerfüggoek, de rendsze-rint a CPU által használható ido, a maximális fájlméret, programok data- és stackterületének mérete, fájlleírók száma stb. állíthatóak be.

login [user [-p]] Leállítja a login shell-t és elindítja a login parancsot. A -p opció hatására az elozo környezetet átmenti az új felhasználó számára.

logout Leállítja a login shell-t. nice [+n|-n] [command] Megváltoztatja a definiált parancs (ennek hiányában az aktuális shell) pri-

oritását. Minél magasabb számértéket adunk meg, annál kisebb prioritás-sal (lassabban) fog futni a rendszer. A prioritást növelni csak a privilégizált felhasználóknak van joga. A megadható számérték -20 és +19 közti érték lehet, a default 4.

Page 204: unix kézkönyv

UNIX felhasználói ismeretek

206

notify [%job] Ha a megnevezett, illetve ennek hiányában az aktuális job állapota meg-változik, aszinkron módon, közvetlenül értesíti a felhasználót.

onintr [-|label] A Bourne shell trap parancsának megfeleloje, a szoftver megszakítások (szignálok) lekezelésére. Ha argumentum nélkül hívjuk meg az onintr pa-rancsot, alapállapotba állítja a megszakításkezelést: ez azt jelenti, hogy egy szignál érkezésekor (leggyakrabban ha a felhasználó CTRL-C billen-tyuvel „lelövi” a programot (TERM szignál)) a shellscript elhal, a vezér-lés pedig átadódik a script-et indító shell szintjére. A - opció hatására az összes szignált figyelmen kívül hagyja a script.10 label megadásával a script egy

goto label parancsot fog végrehajtani, valahányszor szignál érkezik. popd [+n] Eloveszi (egyben törli) a katalógus-verem legfelso elemét, és oda vált. Ha

számértéket is megadunk, a verem n-edik elemét törli a shell (de nem vált oda!).

pushd [+n | dir] Ha paraméter nélkül hívjuk meg, a katalógus-verem elso két elemét cseréli meg (nulladik és elso), egyúttal átvált az új nulladik elemre.

Ha számparamétert adunk meg, a katalógus-verem n-edik elemét a verem tetejére helyezi (és oda is vált), a többi katalógust pedig rotálja.

Ha katalógusnévvel hívjuk meg, a dir katalógust a verem tetejére rakja és egyúttal oda vált.

rehash A shell a gyorsabb hozzáférés érdekében belso (ún. hash-algoritmussal feltöltött) táblákban tartja nyilván a path változóban szereplo katalógu-sokban lévo összes parancsot. A rehash paranccsal ezeket a táblákat tud-juk frissíteni, ha valamelyik katalógusba új parancsot írtunk be.

repeat n cmd A cmd parancsot n-szer végrehajtja.

10 Vannak olyan szignálok, amelyeket nem lehet letiltani: a KILL és a STOP szignál nem fogható el, és a hozzá-

juk rendelt default akció sem változtatható meg.

Page 205: unix kézkönyv

11. fejezet A C shell

207

set [var [=value]] set var[n]=word Paraméterek megadása nélkül az összes shell változó értékét listázza ki, a

több szóból álló változóértékeket zárójeles listaként. Ha csak a var válto-zónevet adjuk meg, a változóhoz üres (null) értéket rendel. a var[n] mega-dás a var változó n-edik eleméhez rendel értéket.

A változókhoz rendelt értékeken a shell elobb végrehajtja az esetleges fájlnév- és változó behelyettesítéseket.

setenv [VAR [word]] Argumentum megadása nélkül az összes környezeti változó értékét listáz-

za ki. Csak a VAR változónév megadásával a változóhoz az üres (null) ér-téket rendeli. (A környezeti változók a konvenció szerint nagybetusek.)

shift [var] A var változó, illetve argumentum megadásának hiányában az argv shell-változó elemeit eggyel balra lépteti a shell, azaz az elso elemet eldobja, a második lesz az elso, stb.

source [-h] name Shell parancsokat olvas be és hajt végre a name fájlból. A -h opció hatásá-ra a name fájlból beolvasott parancsokat az eseménypufferbe helyezi, anélkül hogy végrehajtaná oket.

stop [%job] A megadott, ennek hiányában pedig az aktuális jobot leállítja. suspend Felfüggeszti a futó shell végrehajtását, hasonlóan a CTRL-Z billentyuhöz. switch (string) case label: ... breaksw ... default: ... breaksw endsw Többirányú elágaztatás: arra a case ágra ugrik a vezérlés, amelynek label

mintája illeszkedik az expr kifejezésre. Ha nem volt illeszkedo minta, a default ág hajtódik végre.

time [cmd] Argumentum megadása nélkül a futó C shell és az általa elindított gyer-mek folyamatok által felhasznált összes idot írja ki. A cmd parancs mega-dásával végrehajtja azt, és cmd végrehajtási idejét írja ki.

umask [value] A létrehozandó új fájlok hozzáférési jogait állítja be, illetve listázza ki. unalias pattern Törli a pattern nevu aliasokat. (A végrehajtás elott fájlnév behelyettesítést

végez a megadott alias néven, unalias * pedig törli az összes definiált aliast.) unhash Letiltja a belso hash tábla használatát. unlimit [-h] [resource] A resource eroforrásra bevezetett korlátokat feloldja. Ha nem nevezünk

meg eroforrást, akkor az összes eroforrásra vonatkozó limitet törli. A -h opció hatására a hard limiteket törli. Ezt – akárcsak a beállítást – csak privilégizált felhasználó teheti meg.

unset pattern Törli mindazokat a változókat, amelyek neve (a fájlnév behelyettesítési szabályok szerint) illeszkedik a pattern mintára.

Page 206: unix kézkönyv

UNIX felhasználói ismeretek

208

unsetenv VAR Törli a VAR környezeti változót. Az unset paranccsal ellentétben, a VAR változónéven nem történik fájlnév behelyettesítés.

wait Nem ír ki addig parancspromptot, amíg a háttérben futó folyamatok be nem fejezodnek, illetve megszakítás nem érkezik.

while (expr) ... end Mindaddig végrehajtja a while és end közti részt, amíg expr kiértékelése

igaz (nem nulla) logikai értéket ad. %[job][&] A megadott, illetve ennek hiányában az aktuális jobot az elotérbe hozza;

ha a & jelet is megadjuk, akkor job a háttérben fut tovább.

Page 207: unix kézkönyv

209

12. FEJEZET

A KORN SHELL

A UNIX történetének leírásakor már említettük, hogy a Korn shell a Bourne shell továbbfej-lesztéseként jött létre a Bell Laboratóriumban, David Korn munkájának eredményeként. Mi-vel ez egy továbbfejlesztés, ezért micimackói logikával mindjárt fel is tehetjük a kérdést, hogy miben jobb vagy több a Bourne shell-nél. Néhányat megemlítünk az elonyökbol:

— "history" buffer kezelés. Ez nem más, mint az a lehetoség, hogy a már elozoleg begé-pelt és végrehajtott parancsot újra elo lehet hívni. Tapasztalatunk szerint ez nagyon megdobogtatja a makacs DOS kedvelok szívét.

— Álnevek, azaz aliasok, bevezetése. Ez újabb eszköz arra, hogy a shell interaktiv felüle-tét ízlésünk szerint alakítsuk, kényelmesebbé tegyük.

— Bevezeti a job fogalmát, ami a legtöbb esetben jobban érdekli a felhasználót, mint a fu-tó processek fogalma.

— A további jó tulajdonságok felsorolása helyett inkább megemlítjük, hogy a Korn shell 95%-ban felülrol kompatíbilis a Bourne shell-lel.

Ennyi jó után most mindezt részletezzük, de természetesen csak azokra a tulajdonságokra té-rünk ki részletesen, ami a Bourne shell-étol eltér.

Indítás és kilépés a Korn shell-bol A Korn Shell rendszerint a /bin/ksh parancs futtatásával élesztheto fel a Bourne shell-bol, de a felhasználó login shell-jévé is teheto. Ez utóbbi esetben is természetesen végrehajtódik a login folyamat végén a felhasználó úgynevezett home katalógusában lévo .profile állomány.

A shell minden elindulásához az ENV környezeti változó segítségével még egy induló shellscript-et is köthetünk. A shell futását a már használt eof karakter, általában a CTRL-D, leütésével vagy az exit parancs beírásával lehet befejezni.

Ellentétben a C shellel, a Korn shellbol való kilépéskor nem hajtódik végre automatikusan egy logout konfigurációs parancs. Ha mindenképpen szükségünk van erre a funkcionalitásra, az "Ami kimaradt..." címu fejezetben tárgyalt módon, egy trap1 parancshoz rendelhetjük a kívánt scriptet, s így a shell megszunésekor automatikusan le fog futni.

1 A trap parancs segítségével egy parancsot tudunk rendelni egy szignálhoz. A parancs akkor fut le, ha a szignál megjelenik.

Page 208: unix kézkönyv

UNIX felhasználói ismeretek

210

Konfigurációs fájl és shell-változók A Korn shell a Bourne shell-hez képest további beépített változókat vezet be. Ezek közül a legfontosabbakat, illetve a legérdekesebbeket ismertetjük. Amennyiben az ENV környezeti változónak értéket adtunk, azt a shell egy futtatható állomány nevének fogja fel, és minden ksh híváskor, így a bejelentkezés után is, megpróbálja lefuttatni. Ennek az állománynak szo-kásos, de nem kötelezo elnevezése .kshrc. Mi a továbbiakban mint környezeti állományra fo-gunk rá hivatkozni. Használata érdekes ötleteket sugall a saját környezet rugalmas alakításá-ra.

Az EDITOR és a VISUAL változók definiálják, hogy az editálást lehetové tévo parancsokban (például állománynév behelyettesítés, parancssor editálás) melyik editor muködésmódját emulálja a shell. A Korn shell a vi és az emacs editor üzemmódokat támogatja, könyvünkben a továbbiakban a vi üzemmód használatát tételezzük fel.

A MAILPATH változóban több útvonalat is meg lehet adni, amelyek mind „leveles-ládák-hoz” vezetnek. Amikor értéket adunk ennek a változónak, implicite felszólítjuk a shell-t, hogy a MAIL-ben megadott postaládánkon kívül ezeknek az állományoknak a változását is figyel-je a MAILCHECK által definiált idoközönként.

A PWD változó az aktuális, az OLDPWD változó az utolsó cd parancs elotti katalógus nevét tartalmazza.

A RANDOM shell-változó egy kvázi-véletlen értéket tartalmaz.

A PS1 változó itt is a promptot tartalmazza, méghozzá alapértelmezés szerint a dollár jelet. Nagy elony a Bourne shellhez képest, hogy a shell minden egyes kiíratáskor újraértékeli PS1 értékét, így ha például szerepeltetjük benne a PWD változót, a promptban a DOS-ban megszokott módon lesz látható az aktuális katalógus. (Számos vizsgálat tanúsága szerint szerint a leggyakrabban végrehajtott Unix parancsok listáját utcahosszal vezeti a pwd parancs...) Hálózatos környezetben még kényelmesebbé tehetjük életünket, ha gépünk nevét is szerepeltetjük a promptban:

host=`uname -n` # az uname parancs révén kinyert gépnév a host nevu változóba PS1='${host}:${PWD}> '

Ha a fenti két sort szerepeltetjük .kshrc fájlunkban, a prompt az alábbihoz hasonló lesz: hp:/users/janos>

A C shellhez hasonlóan itt is lehetoség van a kiadott parancsok sorszámozására a ! karakterrel, így ha a PS1='!${host}:${PWD} ! ' megadást használjuk, promptunk ilyen jellegu lesz: [46] hp:/usr/lib/terminfo>

A REPLY, LINE, PS3, - (elválasztójel), HISTFILE, HISTSIZE értelmezését az alkalma-zásnál ismertetjük.

Page 209: unix kézkönyv

12. fejezet A Korn shell

211

Az _ (aláhúzás) jelöli az elozo utasítássor utolsó argumentumát.

Az elozoek illusztrációjaként nézzük meg, mi történik, ha a $HOME/.profile-unkat így egé-szítjük ki: ENV=$HOME/.kshrc let SorSzam=0 trap "$HOME/.logout" 0 export ENV SorSzam

A Korn shell minden indulásakor keresni fogja a $HOME/.kshrc nevu állományt, mivel ezt találja az ENV változóban, hogy azt lefuttassa. Ennek az állománynak a tartalma az alábbi: $ cat $HOME/.kshrc let SorSzam=$SorSzam+1 echo Uj shell indul $

Végül a $HOME/.logout tartalma: $ cat $HOME/.logout let SorSzam=$SorSzam-1 if test $SorSzam gt 0 then echo Meg nem erte el az utolso reteget fi echo "A kilepes `date |cut -c12-20 ` -kor tortent" $

Gondoljuk végig mi történt, ha a képernyon következo sorozatot látjuk. login:zsu Uj shell indul $ echo $SorSzam 0 $ ksh Uj shell indul $ echo $SorSzam 1 $ exit Meg nem erte el az utolso reteget A kilepes 12:10:00:-kor tortent $ exit A kilepes 12:10:02:-kor tortent login:

A shell opcióinak beállítása A shell opciói a shell funkciók végrehajtásának módját határozzák meg. Az opciók be- (on) illetve kikapcsolt (off) állapotban lehetnek. Az opciókat a set -o paranccsal lehet lekérdezni, illetve átkapcsolni. Ennek ismertetése a Korn parancsok közt megtalálható.

Page 210: unix kézkönyv

UNIX felhasználói ismeretek

212

Az opciók:

(Az értelmezés mindig a bekapcsolt állapotra vonatkozik. A felsorolás sorrendje pedig a set -o parancs diktálta sorrend.) allexport Minden paraméter automatikusan exportált. errexit Ha a shell-t nem-interaktív üzemmódban dolgozik, és egy utasítás végre-

hajtása elhal, futtassa le az ERR hibaszignálhoz kötött függvényt és azon-nal lépjen ki. (Ezt a módot a shell ignorálja a .profile futása alatt.)

bgnice Minden bg paranccsal indított job, alacsonyabb prioritással fut tovább. emacs gmacs Bekapcsolt állapotban az utasítássor az emacs gmacs editorok szabályai

szerint javítható. ignoreeof Nem lehet fájl-vége jellel (azaz CTRL-D -vel) kilépni a shell-bol, helyette

kötelezo az exit parancs begépelése. keyword A parancs sorában, a parancs után eloforduló értékadások is a parancsot

hívó shell változóit állítják. markdirs A kiírt állománynevek között / karakterrel megjelöli a katalógusokat. monitor A háttérben futó jobok külön folyamat-csoportot alkotnak, és ha

befejezodnek, a futásuk eredményességérol egysornyi üzenettel tájékoztat-nak.

noexec A beírt az utasítássorokat a shell nem hajtja végre. noglob Kikapcsolja a shell állománynév illesztési (globbing) mechanizmusát.

(Például nem helyettesít be egy csillag helyére tetszoleges állományne-vet.)

nounset Jelzi, ha értéket nem kapott változó értékére akarunk hivatkozni. verbose Minden begépelt utasítást végrehajtás elott visszaír a képernyore. trackall Az utasítások az elso használatkor teljes elérési útvonalukkal bekerülnek

az aliasok táblázatába. vi Az utasítássor vi editor jelleggel javítgatható. Ennek részleteit a history le-

hetoség leírásánál fogjuk látni. viraw Úgy értelmezi a karaktereket, mintha vi editorban dolgozva gépeltük volna

be. xtrace A shell behelyettesítéseinek elvégzése után, de a parancsvégrehajtás elott

visszaírja a parancssort.

A - (elválasztójel) változó a bekapcsolt opciókat jelzi: $ echo $- iskm $

A fenti példa azt jelzi, hogy is --interactiv shell, k --keyword, m -- monitor, tehát az alábbi példában ez a három opció van bekapcsolva. $ echo $- iskm $

Page 211: unix kézkönyv

12. fejezet A Korn shell

213

A shell, mint parancsértelmezo tulajdonsá-gai

A Korn shell rendelkezik mindazokkal a parancsértelmezo képességekkel, amivel a Bourne shell. Tehát lehet vele a standard ki- és bemenetet stb. átirányítani, parancsokat csohálózatba összefuzni, valamint vannak a parancshatárolók, mint ';' (pontosvesszo, azaz a sorozatbani végrehajtás jele), '&&' (logikai ÉS kapcsolat, a második utasítást csak az elso sikeres futása után indítja) végül a '||' (logikai vagy, a második utasítást csak az elso sikertelen futása esetén indítja), valamint képes shellscript-ek futtatására is. Mindebbol részletesen csak arról szólunk ami valamiben eltér a Bourne shell-beli megoldástól, vagy annál többet nyújt. Így nem kell külön foglalkoznunk avval, hogyan illeszti a legtöbb metakaraktert (*,?, [...]) a shell az állo-mánynevekre, és az idézojelek használatával. A specialitásokat az alábbiakban foglaljuk össze:

Kétirányú csohálózat

A kétirányú csohálózat, népszerubben kétirányú pipe, megértéséhez elobb a normál egyirányú pipe fogalmát kell megértenünk. Az egyszeru csoháló- zat lényege, hogy két folyamat egy FIFO-n keresztül kommunikál egymás- sal, az $ ls -l | grep '^d'

parancssor például csak a katalógusokat írja a képernyore. A folyamatot a kernel vezérli, fela-data az, hogy az ls ne töltse túl a FIFO-t, a grep viszont várakozzon, ha a FIFO üres. Kétirá-nyú pipe esetén a Korn shell egy olyan folyamatot hoz létre, ami a be- és kimenetét egyaránt a szülo shell-tol kapja, egy FIFO-n keresztül.

Kétirányú pipe-ot a parancs után tett- '|&' karakterpárral tudunk létrehozni, ami után shell-bol a print -p és read -p parancsokkal tudunk a folyamattal kapcsolatot tartani.

Nyilvánvaló, hogy ezt a lehetoséget leginkább interaktív módon muködo utasítások esetén le-het kihasználni, ilyen azonban a UNIX-ban nem sok van. Szintén jól használható ez az esz-köz, ha közbenso állomány létrehozását akarjuk elkerülni.

A nagyabc nevu script a tr parancsot használja fel a kétirányú pipe-hoz. A bemenetére írt so-rokat a kimenetére írja, miközben a nagybetuvel kezdodo sorok összes magánhangzóját szin-tén nagybeture cseréli. (Nem túlságosan izgalmas feladat, de talán a kétirányú csohálózat al-kalmazásának egy lehetoségét bemutatja.) $ cat nagyabc tr [aeiou] [AEIOU] |& while read a do if echo $a|grep '^[A-Z]' >/dev/null

Page 212: unix kézkönyv

UNIX felhasználói ismeretek

214

then print -p $a read -p a fi echo $a done $

A nevjegyzek hasonló módon hívja az általunk írt keres nevu parancsot, hogy megnézesse vele, hogy a bemenetére küldött név szerepel-e a cimlist fájlban. A példa ugyan bugyuta, a feladatot egyszerubben is meg lehet oldani, inkább csak meg kívántuk mutatni, hogy hogyan dolgozik egy magunk által írt script kétirányú pipe segítségével. $ cat keres read a if grep $a cimlist >/dev/null then print -p "igen" else print -p "Kerem a $a cimet:\c" fi $ $ cat nevjegyzek while read a do keres |& print -p $a read -p b if [ "$b" = "igen" ] then echo "Van ilyen nev a listaban" * else echo $b read b; echo $a : $b>>cimlist fi done $

Az echo parancs argumentumába írt \c a soremelést tiltja be.

Állománynév kiegészítések

Emlékszünk rá, hogy a Bourne shell-ben bizonyos esetekben nem kellett kiírnunk az állomá-nyok neveit, hanem a csillagot vagy kérdojelet tartalmazó argumentum helyére a shell behe-lyettesítette a katalógusban lévo állománynevekbol azt amire a minta illett, majd az így kifejtett parancsot adta át a kernelnek végrehajtásra. Az állománynév kiegészítéssel a Korn shell egy olyan eszközt ad, amivel parancsvégrehajtás elott visszakapjuk a mintánkra illeszkedo állományneve(ke)t, ami(ke)t ezek után elfogadhatunk, vagy átírhatunk. Ezt a szol-gáltatást az ESC és még egy másik billentyu megnyomásával lehet kiváltani.2

2 A Korn shell nem mindegyik régebbi verziójába építették be ezt a lehetõséget.

Page 213: unix kézkönyv

12. fejezet A Korn shell

215

Lehetoségeink az alábbiak.

Két ESC leütésére felkínálja az illeszkedo nevet, ha csak egy van, ha pedig a keresett minta több névre is illeszkedik, a shell a leghosszabb közös részt írja vissza. Ezt a továbbiakban tetszolegesen módosíthatjuk.

Az ESC= karakterpáros leütése után a shell felsorolja az összes illeszke- do nevet, és az utasítás megismétlésével várja, hogy a hiányzó karaktereket kiegészítsük. Ah-hoz, hogy ezt megtehessük, elobb az 'a' karaktert (append) kell leütnünk, ekkor a vi 'append' módjához hasonlóan továbbírhatjuk a nevet.

Az ESC* karakterpáros után a shell egy sorban ajánlja fel az illeszkedo neveket:

Meroben más lehetoség, amikor változók értékeit íratjuk be a shell-lel, a változó neve után leütött két ESC karakterrel.

A fenti lehetoségek nem csak állománynevekre, hanem katalógus útvonalakra is alkalmazha-tóak.

Tilde jel behelyettesítése

A tilde (~) karakternek az elofordulás helyétol függoen az alábbi értékei lehetnek: — Egyedül állva értéke a HOME változó tartalmával egyenlo.

$ echo $HOME /home/book $ echo ~ /home/book $

Page 214: unix kézkönyv

UNIX felhasználói ismeretek

216

— Ha egy + jel követi, a PWD tartalmával lesz azonos, ha - jel, akkor az OLDPWD-vel. $ cd fejezet $ pwd /home/book/fejezet $ echo ~+ /home/book/fejezet $ echo ~- /home/book $

— Ha egy /-el lezárt karaktersor követi, akkor megkeresi az /etc/passwd állományban, hogy talál-e ilyen alap nevu felhasználót, ha igen, akkor az o alapkatalógusának teljes elérési útvonalát adja vissza.

$ ls ~book/fejezet Korn vi Csh $ ls /home/book/fejezet Korn vi Csh $

Változók és a paraméter helyettesítések

Kétfajta változó van, a pozicionális, amire most is sorszámmal hivatkozunk, és a névvel azo-nosítható. A shell-be beépített névvel azonosított változókról már esett szó.

A Korn shell-ben a változóknak deklarálhatunk típust, illetve használhatunk tömböket. A típusdeklarálás a typeset paranccsal történik, amit a parancsok közt ismertetünk. A típusdeklarációval bevezetett változóra a shell vigyáz, hogy ne kaphasson más típusú értéket. $ typeset -i a $ a=qq ksh:qq:bad number $ a=1+1 $ echo $a 2 $

A változók értékének már ismert helyettesítési szintaktikája kissé módosult. $ echo $par

Semmit sem látunk, mert ilyen nevu változónak még nem adtunk értéket $ echo ${par:-"par ures"} par ures $ echo $par $

Beírja a helyettesíto értéket, de a változót beállítatlanul hagyja. $ echo ${par:=value} value

Page 215: unix kézkönyv

12. fejezet A Korn shell

217

$ echo $par value $

A változó értéket kap, ami ki is íródik az outputra. $ echo ${par:+masik} masik $ unset par $ echo ${par:+ujabb+} $

Az értéket kapott változó helyett a helyettesíto érték íródik be, az üreset egy szóköz jelzi. $ echo par $ echo ${par:?value} value login:

Ha a változó még nem kapott értéket, a helyettesíto érték íródik be és kiléptet a shell-bol. Ha nem adunk helyettesíto értéket és üres a változó, egy „behuzalozott” üzenet jelenik meg.

Az elobbi kifejezésekben használt kettospontot ha elhagyjuk, elmarad an- nak vizsgálata, hogy a változó kapott-e már értéket. (A Bourne shell-ben ez a vizsgálat nem iktatható ki.) További lehetoség a paraméterek értékének helyettesítésére a minta segítségével történo kivágás. Ennek általános alakja: ${parameter##minta} illetve ${parameter%%minta} $ echo $HOME /home/un $ echo $PWD /home/un/book $ c=${PWD#${HOME}} $ echo $c /book $

A # hatására a shell a paraméter értékének elejére illeszti azt a mintát, ami a # másik oldalán talál, és csak a nem illeszkedo részeket írja ki. Egy # esetén a legrövidebb, ketto esetén a leg-hosszabb illeszkedést keresi $ echo ${x%:*} noveny:gyumolcs $ echo ${x%%:*} noveny $

A '%' karakter esetén az illesztés logikája hasonló az elobbi esethez, de a levágandó mintát hátulról keresi.

Page 216: unix kézkönyv

UNIX felhasználói ismeretek

218

Mindkét esetre igaz, hogy ha a shell nem talál illeszkedést, a paraméterek teljes értékét írja vissza.

Shell változók tömbjét létrehozhatunk típusdeklarációval vagy értékadással. A C nyelvben használatossal megegyezo módon a tömbindex számozása 0-val kezdodik, a tömbelemre pe-dig szögletes zárójelbe tett indexszel lehet hivatkozni. $ typeset -u a[2] $ b[0]=DES $ b[1]=szilva $ a[1]=EUKLI $ echo ${a[1]}${b[0]} megírta az elemeket EUKLIDES megírta az elemeket

A változókkal kapcsolatban meg kell említenünk néhány speciális jelentésu karaktert, illetve jelölést. A Bourne shell-hez hasonlóan a $* illetve a $@ tartalmazza a shellscript összes para-méterét, a $1-essel kezdve, szóközökkel elválasztva.

Page 217: unix kézkönyv

12. fejezet A Korn shell

219

Ha elemek egy változótömb, akkor a következok lehetségesek. $ elemek[0]=csok $ elemek[1]=or $ elem=csokor $ echo ${elemek[*]} csok or $

A kifejezés az elemek tömb elemeit írja ki. $ echo ${#elem} 6 $

Ez a kifejezés az elem helyettesítési értékében a karakterek számát írja ki. $ echo ${#elemek[*]} 2 $

A visszaadott érték az elemek tömb elemeinek száma.

Utasítások behelyettesítése

Utasítások helyettesítésére Bourne shell-ben használt visszafele dolo idézojel, `parancs`, for-ma mellé új alak lép be: $(parancs). $ echo "A bejelentkezett felhasznalok: $(date; who|sort)" Fri Jul 30 10:22:03 EDT 1993 jani console Jul 30 09:35 un tty01 Jul 30 09:00 $

A zárójeles alak egymásba egyszerubben skatulyázható mint az idézojeles. Így az alábbi két alak egyenértéku: $ echo $(echo $(echo szia)) szia $ echo `echo \`echo szia\` ` szia $

Ezzel az írásmóddal egyszerusítéseket lehet az utasítások írásába vinni, ha épp valakinek erre szottyan kedve. Az itt következo mindhárom esetet a shell elfogadja és azonosan értelmezi. $ echo "\n$(cat file)" $ echo "\n $(<file)" $ echo `<file`

Végül nézzünk egy érdekes példát a pozicionális paraméterek helyettesítésére is. Az alábbi sor egy shellscript belsejébol való és az X-edik pozicionális változó értékét íratja ki.

Page 218: unix kézkönyv

UNIX felhasználói ismeretek

220

x=1 echo " a $x valtozo erteke $(eval echo \$$x)"

Gondoljuk meg mit írna ki az echo az eval függvény nélkül! A fenti echo paranccsal azonos outputot adó egysornyi echo parancsot Bourne shell-ben nem is tudunk írni. Ezen is elgon-dolkodhatunk, hogy vajon miért?

Alias-ok és függvények

A shell-ben az alias parancs segítségével egy úgynevezett alias vagy álnév táblát lehet feltöl-teni. A táblázat minden bejegyzése egyenloségjellel összekapcsolt két karakterlánc. A shell a parancs végrehajtásakor rendre megkeresi, hogy a parancssor elemei szerepelnek-e valame-lyik bejegyzés bal oldalán, és ha igen, akkor helyettesíti az egyenloségjel jobb oldalán lévo karakterlánccal. Nagyon fontos tulajdonság, hogy minden parancs értelmezésénél csak egyet-len egyszer nézi meg a shell ezt a táblázatot.

Így az alias-ok használata egy újabb lehetoség arra, hogy a UNIX felhasználói felületét komfortosabbá tegyük a magunk számára.

Azért, hogy felhasználási példákat lássunk, nézzük meg egy alias tábla egy részletét: $ alias false=let 0 functions=typeset -f history=fc -l integer=typeset -i r=fc -e - true=: type=whence -v ls=/bin/ls who=who|sort $

A fenti lista az utolsó két sortól eltekintve a shell-ben kiinduláskor is benne lévo alias-okat mutatja. Magyarázatra az 'ls=' kezdetu sor szorul. Itt arról van szó, hogy ha az utasítás helyett a teljes útvonalat adjuk meg, ahol a parancs elérheto, akkor a parancsvégrehajtás idejét rövidítjük meg. Miért? Gondoljunk arra, hogy a végrehajtandó állományokat a shell a PATH tartalma szerinti helyeken keresi. Mielott tovább olvasná az olvasó a fejezetet, megkérjük, hogy gondolatban keresse meg a shell opciók között a track-et.

Az alias-ok használatakor az ember úgy érzi, hogy jó lenne, ha szimbolikusan hivatkozhat-nánk az utasítás argumentumaira is. Mivel itt egyszeru táblázat alapján történo behelyettesí-tésrol van szó, ezt nem tudjuk megtenni. A hiányt pótolni lehet a függvények használatával. A prompt után írt eddig még nem használt kulcsszó és az utána tett nyitó-csukó zárójelpár jel-zi a shell-nek, hogy függvényt akarunk definiálni. Amennyiben szándékunkat megérti, a RETURN leütése után a folytatósori prompt jelenik meg a képernyon. A függvény magját a sor elejére írt kapcsos zárójel pár közé írjuk, szintaktikailag a shellscript-ekkel azonosan.

Page 219: unix kézkönyv

12. fejezet A Korn shell

221

Lássunk egy példát, ahol a cd parancs végrehajtását úgy bovítjük ki, hogy a promptban meg-jelenjen az aktuális katalógus. $ cdd() >{ cd $1; PS1='! $PWD $' > } $ cdd /bin 123 /bin $

Megjegyzendo, hogy a függvény belsejében is használhatunk alias-okat. Ne feledjük, hogy az interaktívan definiált alias-ok és függvények csak a shell-bol való kilépésig élnek, ezért azo-kat, amelyeket mindig használni kívánunk, a konfigurációs fájljainkba kell beleírnunk.

Page 220: unix kézkönyv

UNIX felhasználói ismeretek

222

Egész aritmetika

A let parancs argumentumaként aritmetikai kifejezés adható meg, amit a shell long integerek-bol álló aritmetikai kifejezésként értékel ki. Az alábbiakban, a kiértékelés szempontjából csökkeno precedencia sorrendben a használható operátorokat soroljuk fel. - minus jel (kötojel) ! logikai negálás * / % szorzás, osztás, maradék képzés +- Összeadás, kivonás <= >= <> Összehasonlítás == != azonosság, különbség = értékadás

A muveletek végrehajtásának sorrendjét zárójelekkel lehet átrendezni. Szintaktikusan ez a gömbölyu "()" zárójelpárt jelenti.

Amikor a < vagy a > jelet használjuk, a kifejezést idézojelek közé kell tennünk, hogy a shell ne tévessze össze az I/O átirányítással.

A let szócskát helyettesíthetjük a "(())" zárójelpárral.

Nézzünk példákat. A let argumentumaként kapott értékadásban a muveleti jeleket valóban muveleti jelként fogja fel. $ a=11+1 $ echo $a 11+1 $ let a=11+1 $ echo $a 12 $

Idézzük fel, hogy Bourne shell-ben egy ilyen értékadást hogyan tudnánk elvégezni!

Az alábbi, tartalmában már ismeros, ébresztoóra script Korn shell alatt így írható meg:

Page 221: unix kézkönyv

12. fejezet A Korn shell

223

$ cat vekker let a=`date | cut -c12-13` let c=`date | cut -c15-16` until ((a==$1))&&((c>=$2)) do sleep 50 let a=`date | cut -c12-13` let c=`date | cut -c15-16` done echo brrr $

A job fogalma

A job nem más mint egy parancssor végrehajtás közben a maga teljes környezetével. Legegy-szerubb esetben ez egy parancs végrehajtása, de egy jobnak számít egy csohálózat is, mint az alábbi példában: $ ls -l|grep '^d'|sort>katalogusok

Információt a rendszerben nyilvántartott munkákról a jobs paranccsal lehet kérni, ami válasz-ként a jobszámot (szögletes zárójelben), a job állapotot, egy + vagy - jelet, valamint az erede-ti utasítássort adja. A jobszám egy egész szám, amit a rendszer oszt ki. A job állapot az alábbi három érték egyike: Running, Done, Stopped, azaz futó, befejezodött és leállított A + jel az aktuális, a - jel a megelozoen indított munkát jelöli.

Stopped állapotba a rendszer suspend karakterével lehet a munkát tenni. A suspend karakter az stty paranccsal állítható. A szokásos beállítás: $ stty susp CTRL-Z

A terminál használata és egy job futása között nem kell szoros kapcsolatnak lenni, például egy hosszan futó parancsnak nem kell az egész futás alatt a terminált foglalni. Erre megoldás a már a Bourne shell-bol ismert háttérben futtatás, amit a parancs utáni & jellel kezdemé-nyezhetünk. A shell midon a háttérbe teszi a munkát, visszaírja a jobszámot, szögletes záró-jelben, és a folyamatszámot. A késobbiekben erre a munkára %jobszám-mal lehet hivatkozni. Az fg paranccsal elotérbe hozhatjuk; az elotérben futó jobot pedig a susped (rendszerint CTRL-Z) karakterrel felfüggeszthetjük, majd az fg, illetve bg paranccsal az elotérben, illetve a háttérben tovább futtathatjuk. Amennyiben lefutása elott kívánjuk a munkát befejezni, ak-kor a kill paranccsal megölhetjük. Ha a monitor shell opció be van kapcsolva, a háttérben fu-tó, de normálisan befejezodo parancs valami hasonló állapotüzenetet küldi a képernyore: [1]+Done du|sort>diskus&

Az utasítássor editálása, history használata

Page 222: unix kézkönyv

UNIX felhasználói ismeretek

224

Gyakran tapasztaljuk, hogy azok akik DOS felhasználok is egyben, hiányolják, hogy a UNIX-ban nem lehet elohívni már egyszer végrehajtott utasításokat, az utasítássort minden esetben újra kell írni. Ez a szomorú tapasztalat igaz a Bourne shell-re, de nem igaz a Korn shell-re.

Amennyiben a shell opciókat megfeleloen állítjuk be, úgy az utasítássor editálható. A shell opciókat természetesen akár interaktiven akár a .profile-unkból vagy a $ENV állományból beállíthatjuk, az alábbi módok egyikével. $ set -o vi

Másik lehetoség, ha a VISUAL vagy az EDITOR változóknak vi, gmacs, vagy emacs érté-ket adva a megfelelo editort tesszük soreditorrá. Az EDITOR értékének vizsgálatára csak ak-kor kerül sor, ha VISUAL nincs beállítva. VISUAL=vi export VISUAL

illetve EDITOR=gmacs export EDITOR

A HISTFILE és a HISTSIZE változók tartalmazzák a parancstörténetet leíró állomány ne-vét, és utasítássorokban számlált méretét. Amennyiben másképp nem rendelkezünk, a history fájl neve .sh_history, hossza pedig 128 parancssor. Ebben az állományban mozoghatunk az editorok egyikével, ahogy azt már leírtuk, valamint az fc (fix command) paranccsal. A paran-csot természetesen ebben az esetben is a parancsokat tartalmazó manuálban részletezzük, most csak néhány példa következik. $ fc -l 20 22 20 pwd 21 ls -l 22 ps $

A -l opció listázza a parancsfájl kijelölt részletét. A history szó egy szokásos alias az fc -l karaktersorozatra.

A -e opcióval az alkalmas editort választjuk ki, amivel a history megadott sorait editáljuk. Az így kialakított parancssorozatot el lehet tenni egy állományba, de függvényként végre is haj-tódik és bekerül a historyba. $ fc -e vi 20 22

Az alábbiakban az fc -e - parancs magában álló mínuszjele a kijelölt editorra vonatkozik. Az argumentum értelmezése a következo: a feljegyzett parancsokban visszafelé haladva, keresse meg az elso olyan echo utasítást ahol a paraméterekben megtalálja a dio szócskát, azt cserélje ki mogyorora. Ezután kiírja az utasítást majd végrehajtja. $ echo De jo a dio De jo a dio $ fc -e - dio=mogyoro echo echo De jo a mogyoro

Page 223: unix kézkönyv

12. fejezet A Korn shell

225

De jo a mogyoro $

A historyt el lehet érni a már említett editorok használatával. Az alábbiakban a vi használatá-ról ejtünk néhány szót. A parancssorban egy ESC karaktert ütve máris editor parancs módban vagyunk. Itt használhatjuk a vi editorból ismert kurzor mozgató billentyuket, parancsmódban kiadható parancsokat (pl.: a,i stb.). Pusztán azt kell tudnunk, hogy a mutató fölfele illetve lefele mozgatásával az elozo parancssorokat tartalmazó állományban mozgunk, azok megje-lennek a képernyon, és javítgathatók, úgy ahogy azt leírtuk. A RETURN gomb leütése után az így kialakított parancssort próbálja a shell végrehajtani.

Page 224: unix kézkönyv

226

13. FEJEZET

AMI KIMARADT...

Ebbe a fejezetbe próbáltuk belegyömöszölni mindazokat a tevékenységeket, amikkel egy felhasználónak elobb utóbb szembesülnie kell egy UNIX rendszeren, ugyanakkor az elvégzendo tevékenységek nem férnek bele egy-egy parancs rövid leírásába; akár azért, mert maga a tevékenység szerteágazó, és nagy jelentosége miatt fontos, hogy a felhasználó a felületesnél kicsit mélyebben megismerkedjen vele; akár pedig azért, mert az adott problémakörrel kapcsolatban számos parancs használatára van szükség, amelyeket nem lett volna célszeru külön-külön szétszórva tárgyalni. Az alábbi témakörök egyúttal mind kicsit "rendszeradminisztrációs ízuek", olyan problémák, amikkel ugyan alapvetoen a rendszeradminisztrátornak kell foglalkoznia, de a hétköznapi munka során gyakran mi sem ússzuk meg az ismerkedést. E fejezet ebben kíván segítséget nyújtani, a terminálkezelés, a nyomtatás, az archiválás, valamint a DOS fájlok kezelésével kapcsolatban.

Terminálkezelés E pontban elsosorban azokkal a problémákkal foglalkozunk, amik a terminálok használatakor léphetnek fel. Általában két eset fordul elo: vagy már a bejelentkezéskor problámák vannak, mert rossz a terminálbeállítás, vagy pedig menetközben állítódik el (például bináris fájl listázása egészen kiválóan alkalmas e célra...). Az elso esetben konfigurációs fájljainkban (.login, .cshrc, .profile) kell a megfelelo beállításokról gondoskodnunk, utóbbi esetben viszont parancssorból kell kiadni a megfelelo parancsokat, gyakran "vakrepülésben", minden visszajelzés nélkül.

Elsoként az stty paranccsal ismerkedjünk meg, ami a terminálbeállítások minden szintjét vezérli, s ismerete valamilyen szinten mindenképpen ajánlatos (bár nem túl élvezetes) a felhasználónak, hacsak nincs állandóan a közelben gyakorlott segítség vagy rendszergazda.

Az stty parancs

Az stty parancs neve a "set teletype" rövidítésbol ered, s már maga a név is nemes patinát és idotlenséget érzékeltet, hiszen hol vannak ma már a teletype-ok? A név mindenesetre megmaradt, s vele a múltból örökölt opciók és beállítási lehetoségek tömege is.

Page 225: unix kézkönyv

Függelék Permutált index

227

Az stty parancs két parancssori opcióval hívható meg: a -a opció hatására az összes beállítást kilistázza, nem csak a legfontosabbakat, a -g opció hatására pedig olyan formátumban történik a kiíratás, hogy egy másik stty parancs bemenetként tudja azt használni.

A parancssorban szereplo összes többi argumentum már a konkrét stty beállításokhoz tartozik, ezeket funkcióik szerint több csoportba osztjuk. Megadásuk némiképp eltér a UNIX opciók többségétol, ugyanis e paraméterek többsége alternáló kapcsolóként üzemel, egy-egy jellemzo terminálfunkciót be-, illetve kikapcsol. A func funkció bekapcsolt (engedélyezett) állapotát az

stty func

paranccsal érhetjük el, míg a kikapcsolást (letiltást) a

stty -func

paranccsal. Néhány paraméterhez másik paraméter is tartozik, ami a tényleges értéket hordozza, például

stty kill ^u

a kill funkcióhoz (teljes sor törlése) a CTRL-U karaktert rendeli.

A fenti szabályok szerint viselkedo opciók az alábbi ismertetokben a (-)func, illetve a func (-func) jelölésekkel szerepelnek.

Page 226: unix kézkönyv

UNIX felhasználói ismeretek

228

Az stty listáiban a vezérlokarakterek a ^c megadással szerepelnek; beíráskor implementációfüggoen vagy ugyanígy adhatunk meg egy vezérlokaraktert, vagy egy backslash karaktert írunk eléje, hogy elnyomjuk esetleges speciális jelentését. A DEL billentyut a ^?, míg az üres, értékkel nem bíró beállítást a „^'” karakterek szokták jelezni.

Az stty által szabályzott funkciók az alábbi nagy csoportokba oszthatóak: kontroll beállítások (control modes), input beállítások (input modes), output beállítások (output modes), lokális beállítások (local modes), vezérlokarakter beállítások (control assignments) és kombinált beállítások (combination modes). Implementációtól függoen más csoportok is lehetségesek, s persze platformonként más és más plusz szolgáltatások is lehetségesek, éppen ezért csak a mindenhol megtalálható, szabványosodott beállításokkal foglalkozunk.

Kontroll beállítások

Ebbe a csoportba tartoznak az általános vonali jellemzoket, sebességet, paritást, flow-controlt szabályzó paraméterek. (-)parenb Paritásbit beállítása és észlelése. (-)parodd Engedélyezése esetén páros, letiltása esetén páratlan paritást alkalmaz. (-)parext Kiterjesztett paritásvizsgálatot engedélyez (mark és space parity). cs5, cs6, cs7, cs8 Beállítja a megfelelo karakterméretet. (Magyar ékezetes megjelenítéshez

értelemszeruen a cs8 beállítás szükséges.) 110, 300, 600, 1200, 2400, 4800, 9600, 19200, 384001 A vonali sebesség beállítása az adott értékre (baud-ban mérve). (Néha

külön ispeed n és ospeed n opciókkal lehet állítani a be- és kiviteli sebességet.)

(-)hupcl Modemes kapcsolat esetén kilépéskor bontja a vonalat. (-)cstopb Engedélyezés esetén 2, letiltás esetén 1 stopbitet használ karakterenként.

Input beállítások

E csoportba tartoznak többek között a beírt karakterek értelmezését és leképzését vezérlo opciók. (-)ignbrk Figyelmen kívül hagyja a bemenetrol érkezo break karaktert (a break egy

speciális hosszúságú vezérlokarakter, többek között a vonali sebesség automatikus felismerésére és váltására használják).

(-)ignpar Figyelmen kívül hagyja a paritáshibákat. (-)istrip Engedélyezése esetén 7 bitesre vágja le a vett karaktereket. (Magyar

ékezetes szöveg esetén ezért mindig le kell tiltani ezt az opciót.)

1 baud = bit/sec.

Page 227: unix kézkönyv

Függelék Permutált index

229

(-)inlcr A beolvasott újsor (NL) karaktert kocsi-vissza (RETURN) karakterré képezi le.

(-)igncr A beolvasott RETURN karaktert figyelmen kívül hagyja. (-)icrnl A beolvasott kocsi-vissza (RETURN) karaktert újsor karakterré (LF)

képezi le. (-)iuclc A beolvasott nagybetuket kisbetukké képezi le. (-)ixon A START/STOP kimenet vezérlési (ún. handshake protokoll) használatát

engedélyezi. (A kiíratás leállítható a STOP vezérlokarakterrel, a START vezérlokarakter vételekor pedig folytatható.) (lásd a vezérlokarakter beállításoknál).

(-)ixany Bármely karakter hatására folytatódik a kivitel, nem csak a START vezérlokarakterre.

(-)ixoff A bemeneti puffer majdnem üres/majdnem teli állapotában START illetve STOP vezérlokarakterek küldését várja.

Output beállítások

(-)opost Továbbfeldolgozás: a kimenet további feldolgozása az alábbi opciók szerint engedélyezett, letiltás esetén további feldolgozás nélkül küldi ki a karaktereket.

(-)olcuc Kisbetuket nagybetuvé konvertálja a kimeneten. (-)onlcr Az újsor (LF) karaktert kocsi-vissza-soremelés (RETURN-LF)

karakterpárrá képezi le a kimeneten. (-)ocrnl A kocsi-visszát (RETURN) újsorrá (NL) képezi le a kimeneten. (-)onocr Az elso oszlopban lévo kurzor esetén nem küldi el kocsi-visszát

(RETURN) a kimenetre. (-)onlret Az újsor (NL) karakter hatására kocsi-vissza (RETURN) funkciót hajt

végre.

Lokális beállítások

(-)isig Leellenorzi, hogy a beolvasott karakterek nem speciális vezérlokarakterek-e (intr, quit, swtch).

(-)icanon Engedélyezi az úgynevezett kanonikus inputot (találóbban talán soreditálásnak nevezhetnénk); ilyenkor az erase és kill karaktereket a kocsi-vissza karakter beérkezése elott feldolgozza.

(-)xcase Kis/nagybetus megjelenítés értelmezése. (-)echo Visszaír a képernyore minden begépelt karaktert. (-)echoe A beütött erase karaktert backspace-szóköz-backspace

karaktersorozatként írja vissza. (CRT terminálokon ennek hatására a törölni kívánt karakter valóban törlodik, bár speciális karakterek, tabulátorok esetén összezavarodhat a megjelenítés.)

(-)echok A kill karakter után újsor (NL) karaktert is kiír.

Page 228: unix kézkönyv

UNIX felhasználói ismeretek

230

(-)echonl Visszaírja a képernyore az újsor (NL) karaktert is. (-)echoctl A vezérlokaraktereket ^c formában jeleníti meg.

Vezérlokarakter beállítások

control-char c A control-char funkcióhoz a c karaktert rendeli. A legelterjedtebb vezérlofunkciók az alábbiak:

eof Fájlvége, illetve bevitel végének jelzése. Rendszerint CTRL-D.

Page 229: unix kézkönyv

Függelék Permutált index

231

erase A kurzor feletti karaktert törli. Rendszerint a DEL, a RUBOUT, illetve a BS billentyuk valamelyike, hagyományosan a # karakter.

intr Program futásának megszakítása. Rendszerint a CTRL-C, idonként a DEL karakter.

kill Teljes addig begépelt sor eldobása. Rendszerint a CTRL-U, hagyományosan a @ karakter.

start Adatkivitel (például képernyolistázás) újraindítása. Rendszerint a CTRL-Q karakter.

stop Adatkivitel (például képernyolistázás) leállítása. Rendszerint a CTRL-S karakter.

susp Folyamatok futásának felfüggesztése. Rendszerint a CTRL-Z karakter.

Kombinált beállítások

A kombinált módok, mint nevük is mutatja, egyfajta menü lehetoséget biztosítanak, jellemzoen együtt eloforduló opciók egyszerre történo beállításához. Néhány a gyakoribbak közül:

Név beállításkombináció evenp, parity parenb cs7

-evenp, -parity -parenb cs8

oddp parenb parodd cs7

-oddp parenb parodd cs8

raw (-raw, cooked) -opost -isig -icanon -xcase (Sormódú be- és kivitel: nincs kimeneti továbbfeldolgozás, az erase, kill, intr, quit, swtch

és eot karaktereket se dolgozza fel.

nl -icrnl -onlcr

-nl -icrnl -onlcr _inlcr -igncr -ocrnl -onlret sane A terminálparamétereket nagyjából mindenhol hasz-

nálható értékekre állítja be.

Eltérés az SVR4 és BSD stty között

Az "egységesített" UNIX-ok elterjedésével, azaz azoknál, ahol mind az SVR4, mind a BSD UNIX-ok parancsai megtalálhatóak, gyakran okoznak gondot azok a parancsok, amelyek mindkét verzióban szerepelnek, de eltéro hívási móddal, vagy muködéssel. Az stty is ezek közé tartozik, s mert elég alapveto szerepet játszik, meg kell hogy emlékezzünk a két verzió legfontosabb eltéréseirol.

Page 230: unix kézkönyv

UNIX felhasználói ismeretek

232

A legfontosabb különbség, hogy az SVR4 alapú stty esetében a vonalparaméterek állítását, illetve lekérdezését a standard inputként megadott periférián végzi, míg a BSD alapú stty ugyanezt a standard outputra hajtja végre. Ha tehát a /dev/tty23 nevu terminál vonali paramétereit állítjuk (mondjuk a karakterméretet szeretnénk a cs8 opcióra állítani), akkor SVR4 rendszer esetén az stty cs8 </dev/tty23 parancsot kell kiadnunk, míg BSD UNIX esetén az stty cs8 >/dev/tty23 a megfelelo beállító parancs2. További eltérés még a két verzió között, hogy a BSD változatnál néhány további opció is szokott szerepelni, többek közt parancssori opcióként a -h, aminek hatására jobban olvasható, oszlopos formátumban írja ki az opciókat és a vezérlokarakter beállításokat.

Terminálproblémák kezelése

Mint már említettük, terminálproblémákkal leginkább két esetben találkozhatunk: egyfelol belépéskor, ha nem megfeleloen beállított paraméterekkel rendelkezik a terminálunk, másfelol ha menetközben állítódik el valamilyen paraméter. A rosszul beállított terminálparaméterek esetén a megoldás kulcsa inkább az illetékes rendszeradminisztrátor kezében van, o tudja csak módosítani a terminálok alapveto vonali paramétereit, ugyanakkor a felhasználó is beállíthat konfigurációs fájljaiban stty paranccsal állítható paramétereket. A leginkább gyakori módosítások a vezérlokarakterek hozzárendelésében, a paritásbitek kezelésében és a karakterméret beállításban lehetségesek; végül is próbálgatással is be lehet loni a megfelelo állapotot, de mindenképpen célszerubb a rendszergazda segítségét kérni.

Más eset, ha menetközben állítódott el a terminál, például egy bináris állomány kilistázásakor. Ilyenkor rendszerint "se kép se hang" állapot következik be, a terminál semmilyen billentyure sem reagál, a képernyo pedig befagy. Az alábbiakban ismertetett módon általában visszaállítható a muködoképes állapot, ha nem, akkor a képernyo ki-bekapcsolását is megkísérelhetjük (egyes rendszereken ez sajnálatos módon kilépteti a felhasználót).

Ha semmilyen billentyure nem reagál a terminál, valószínuleg a sorlezáró újsor (RETURN) karaktert nem érzékeli a terminál. Próbálkozzunk azzal, hogy a parancsok lezárásakor nem az ENTER (RETURN, stb jelzésu) gombot nyomjuk meg, hanem a CTRL-J, illetve a CTRL-M karaktert, majd pedig egymásután mindkettot; ha a be- és kimeneti RETURN-LF leképezések romlottak el, a fenti karakterkombinációk valamelyikére reagálni fog.

Ha a bevitelt már érzékeli a terminál, az

2 Hogy melyik stty verzió hol található (feltételezve, hogy mindkettõ megtalálható gépünkön), az rendszerfüggõ, és a PATH változó által definiált keresési sorrend határozza meg, hogy melyik verziót találja meg elsõnek; a másikra csak teljes névmegadással hivatkozhatunk.

Page 231: unix kézkönyv

Függelék Permutált index

233

stty -a

paranccsal írassuk ki az aktuális beállításokat. Ha semmit nem látunk, valószínuleg a képernyore történo visszaírás (echo) opciók vannak letiltva. Adjuk ki az

stty echo echoe echok

parancsot, ennek hatására már kell hogy visszajelzést kapjunk.

Ha már a bevitelt is érzékeli a terminál és vissza is írja a begépelt karaktereket, akkor többé-kevésbé muködoképes a dolog; ha kiadjuk az

stty sane

parancsot, a terminálparaméterek egy nagyjából mindenhol alkalmazható kombinációra állnak be, innen már "finomhangolással" lehet az eredeti állapotot visszaállítani.

A tput parancs

A tput paranccsal egy terminál beállító paraméterei kérdezhetoek le, illetve küldhetoek ki az adott terminálnak. Egyes opcióival ezenkívül alapállapotba is helyezheto a terminál, s ez az a szolgáltatás, amire szükségünk lehet.

A tput parancs az alábbi formákban hívható:

tput [-Ttype] capname [parms...]

tput [-Ttype] init

tput [-Ttype] reset

tput [-Ttype] longname

A -Ttype megadás opcionális, a type nevu terminált, ennek hiányában a kurrens terminált használja a parancs (ennek neve a TERM shell-változóban található).

Az elso megadási mód esetén a terminál adatbázisban szereplo megjelenítési funkciók értékét lehet lekérni. (A terminál adatbázis a gyakrabban használt terminálok jellemzoit tartalmazza. Az egyes funkciókhoz szabványos elnevezések (capname) tartoznak (például cup a kurzorpozicionálási funkció neve, clear a képernyotörlésé stb), s minden ilyen funkciónál ott szerepel az a karaktersorozat, ami az adott terminálnál az adott funkciót végrehajtja.)

Mivel a lekért funkcióhoz tartozó vezérlokaraktereket a tput a standard kimenetre (azaz a terminálra) listázza ki, ebbol egyúttal az is következik, hogy ha a saját terminálunkra vonatkozó funkciókat kérdeztünk le a tput paranccsal, az adott funkciók azonnal végre is hajtódnak, hiszen a terminál a karaktersorozat megjelenítésekor neki szóló, általa értelmezheto vezérlokaraktereket fog látni. Így például bármely típusú terminálon is jelentkeztünk be, a

tput clear

Page 232: unix kézkönyv

UNIX felhasználói ismeretek

234

paranccsal törölhetjük a képernyot.

A második és a harmadik megadási mód a terminál alapállapotba hozását, illetve inicializálását szolgálja: tput reset hatására az alapállapotba jutáshoz szükséges vezérloszekvenciákat hajtja végre a terminál, tput init pedig a kezdeti inicializáló muveleteket hajtja végre. Ezek azok a parancsok, amiket használhatunk még megbokrosodott terminálunk helyrepofozására. Célszeru általában az stty beállítások korrigálása után kiadni oket.

A negyedik megadási mód az adott terminál nevét és alapveto jellemzoit írjaírja ki, a szokottnál részletesebb formában.

Nyomtatás A nyomtatással kapcsolatos kérdéseket két külön pontban tárgyaljuk, mert az SVR4 és a BSD eltéro parancskészletet használ. Elöljáróban azonban néhány szó arról, ami közös: a UNIX nyomtatáskezelése erosen tükrözi a nagygépes rendszerek filozófiáját, annak minden elonyével és hátrányával együtt. Az elonyök közé sorolható az, hogy egy UNIX rendszer számos nyomtató egyideju és megkülönböztetett kezelésére képes, a nyomtatási feladatokat, a nyomtatókat és a felhasználókat igen komplex szempontok figyelembe vételével képes egymáshoz rendelni. Megoldható az, hogy egyes printerek csak meghatározott felhasználók meghatározott típusú fájljait nyomtassák ki, másokat bárki használhasson, stb. Mindennek viszont (a rendszeradminisztrátorra nehezedo terheken kívül) ára is van: a nyomtatás erosen helyfüggové válik, az a speciális nyomtatási opció, vagy nyomtatónév, ami egy adott rendszerben használható, nem feltétlenül, sot, nagy valószínuséggel egyáltalán nem használható a másikban. A felhasználó szempontjából csak egy biztos fogódzó akad: ha van a rendszerben nyomtató installálva, akkor a default nyomtatási parancs kiadásával valahol, valamilyen formában az adott fájl kinyomtatódik - bármi, ezen túlmutató speciális igény esetén (nyomtató, karakterkészlet, speciális opciók megválasztása stb) az illetékes rendszergazdához kell fordulni.

Mindkét UNIX verzióban igaz az, hogy a nyomtatási parancs (lp, lpr) kiadásakor nem közvetlenül a nyomtatóra kerül az elküldött fájl, hanem egy belso adattároló területre (spooling area), ahonnan a nyomtatásvezérlo démonok indítják el a tényleges nyomtatást. Az egy paranccsal nyomtatásra küldött fájlokat a rendszer egy egységként, úgynevezett nyomtatási feladatként (print job) kezeli; ez a jobfogalom hasonlatos a C és a Korn shell job fogalmához. A nyomtatásvezérlo alrendszer a beérkezo nyomtatási feladatokat sorba állítja, és egymás után hajtja végre oket. Mind a BSD, mind az SVR4 verziójban külön parancsok szolgálnak a nyomtatási sor állapotának lekérdezésére, illetve már elküldött nyomtatási feladatoknak a sorból való kivételére.

SVR4 rendszerek

Page 233: unix kézkönyv

Függelék Permutált index

235

Az lp parancs

Az lp parancs szolgál az SVR4 UNIX rendszerekben a nyomtatásra, illetve a már elküldött nyomtatási feladatok egyes jellemzoinek utólagos módosítására. A parancs általános formátuma a következo:

lp [options] [file(s)...]

illetve

lp -i req-id [options]

Az elso forma a fájlok nyomtatásának elindítására szolgál. Ha nem adunk meg fájlnevet, a standard bemenetet olvassa és küldi tovább nyomtatásra.

Az lp parancs második formájában a már elindított nyomtatási feladatok jellemzoit lehet módosítani; a nyomtatási feladatra annak req-id azonosítójával hivatkozunk. Az azonosítót az lp parancs kiírja a képernyore, az alábbihoz hasonló formában: hp 29: lp proba.c request id is hp3d-2347 (1 file) hp 30:

Az lp által elfogadott opciók az alábbiak (megint csak lehetségesek kisebb-nagyobb, implementációtól függo eltérések): -c Nyomtatás elott másolatot készít a fájlról, nem az eredetit nyomtatja. -d dest A dest nyomtatóra, illetve egy, a dest nyomtatóosztályba tartozó

nyomtatóra küldi a fájlt. Ha a dest egy konkrét nyomtató neve, akkor kizárólag azon nyomtatódhat ki az állomány, ellenkezo esetben bármelyik, abba az osztályba tartozó nyomtatón. Ha nem adunk meg nyomtatónevet, az LPDEST shell-változóból veszi a rendszer, ennek hiányában a default nyomtatóra küldi az állományokat.

-f form-name [-d any] A kiküldött fájlt a form-name nyomtatvány forma szerint nyomtatja. Ha a

választott printer nem támogatja e nyomtatványformát, vagy egyáltalán nincs nyomtatványforma definiálva, a nyomtatást visszautasítja a rendszer. (A nyomtatványformák elore definiált fájlok, például amik a fejléces céges papír leírását tartalmazzák.)

-m A nyomtatás befejeztekor levelet küld a felhasználónak. -n num num példányban nyomtatja a fájl(oka)t. -o options A nyomtató-specifikus opciók megadása. Ezen opciók értelemszeruen

eltérnek egymástól, az alábbiak azok, amelyek az úgynevezett standard nyomtatási felülethez tartoznak, s elvileg minden nyomtatónak ismerni kell oket (zárójelben adjuk meg az alternáló jellegu opciók párját):

nobanner (banner) Nem nyomtat az egyes feladatokhoz fedlapot. nofilebreak

Page 234: unix kézkönyv

UNIX felhasználói ismeretek

236

(filebreak) Az egy feladatban elküldött több fájl esetén nem tesz a fájlok közé lapdobás karaktert.

length =scaled_dec_num scaled_dec_num sor hosszú lapokat nyomtat. scaled_dec_num egy decimális szám lehet, amit az lci karakterek valamelyike követ, és sorban, centiméterben, vagy hüvelykben adja meg a lap méretét. Például a

length=10.6c a 10,6cm laphossznak felel meg. Ha skálázás nélkül, csak számot adunk meg, az sorszámként értelmezodik, azaz a

length=66 beállítás 66 soros laphosszúságot jelent. width=scaled_dec_num A fentiekhez hasonlóan értendoen, a lapszélességet adja meg. A

mértékegység hiányában itt oszlopszámot kell érteni, azaz az width=72 megadással 72 karakter széles sorokat definiáltunk. lpi=scaled_dec_num A sortávolságot állítja be. Mértékegység nélküli szám esetén sor/hüvelyk

értendo.

Page 235: unix kézkönyv

Függelék Permutált index

237

cpi=scaled_dec_num A karaktersuruséget állítja be, mértékegység hiányában karakter/hüvelyk

értendo. Használható még értékként a pica (10 cpi), az elite (12 cpi) és a tömörített (condensed) - utóbbi az adott nyomtató által kezelheto mindenkori legsurubb betukiosztásnak felel meg.

A length, width, lpi és cpi beállításokkal egyidoben nem adható meg a -f opció.

-P page-list A fájl megadott oldalait nyomtatja csak ki. Az oldalszámok mind önálló számok, mind tól-ig jellegu tartománymegadások, mind a ketto kombinációi lehetnek. Nem minden nyomtató szuro támogatja ezt az opciót.

-q A nyomtatási sor prioritásszintjét lehet változtatni a 0-39 tartományban (0 a legmagasabb).

-s Elnyomja az lp program "szószátyár" üzeneteit (például a req-id megadást).

-S char-set [-d any] -S print-wheel [-d any] A nyomtatandó fájlt a megadott char-set karakterkészlettel, vagy

cserélheto írómuves nyomtató esetén a print-wheel írófejjel nyomtatja ki. Ha az adott nyomtató vagy nyomtatóosztály nem támogatja a kívánt karakterkészletet, a nyomtatási kérést az lp visszautasítja.

-t title A fedlapon a title címet nyomtatja ki (alapértelmezés szerint nem nyomtat címet).

-T cont-type [-r] A nyomtatandó fájlt egy olyan nyomtatóra küldi, amelyik képes a cont-type típusú fájlok direkt nyomtatására. Ha ilyen nyomtató nincsen, olyan nyomtatóhoz küldi a fájlt, amelyik rendelkezik a cont-type típusú fájl kinyomtatásához szükséges szurovel. Ha nem talál ilyen nyomtatót, a nyomtatási kérést visszautasítja. (A leggyakoribb, csak ASCII karaktereket tartalmazó fájlok típusa simple, s alapértelmezés szerint a nyomtatók is ilyen típusú fájlokhoz vannak rendelve. Ennek az opciónak a használatára akkor lehet szükség, ha például egy PostScript formátumú fájlt akarunk nyomtatni; ilyenkor nem szükséges tudnunk, melyik nyomtatót címezzük meg név szerint, az

lp -T postscript ... file parancs hatására garantáltan olyan nyomtatón fog megjelenni a fájl,

amelyik képes a PostScript formátum lekezelésére, ellenkezo esetben a kérést visszautasítja a rendszer.

-w A nyomtatás végén üzenetet ír ki a felhasználó termináljára, illetve ha már nincs bejelentkezve, levelet küld neki.

A cancel parancs

Page 236: unix kézkönyv

UNIX felhasználói ismeretek

238

A cancel paranccsal lehet nyomtatási feladatmtatási feladatokat törölni a sorból. A törlendo feladatokat kijelölhetjük azonosítójuk (req-id) alapján, törölhetjük az adott nyomtatóra küldött összes feladatot, vagy az adott felhasználó által indított feladatokat.

A cancel parancs hívási formái a következok lehetnek:

cancel [req-id ...] [printer ...]

cancel -u login-id ... [printer ...]

Az elso hívási formánál vagy a törlendo nyomtatási feladatok azonosítóit írjuk be, vagy a nyomtató nevét - utóbbi esetben a kurrens feladat fog törlodni az adott nyomtatón.

A második hívási mód esetén az adott felhasználó által a megnevezett nyomtató(ko)n indított összes nyomtatási feladat törlodik.

Normál felhasználó csak a saját maga által indított feladatokat törölheti a sorból, a privilégizált felhasználó jogosult csak a teljes sor törlésére.

Az lpstat parancs

Az lpstat parancs révén szerezhetünk információkat a nyomtatási alrendszer állapotáról, beleértve a nyomtatási sorokat is. Argumentum nélkül az összes nyomtatási feladatot kilistázza. Ha argumentum opció nélkül szerepel, azt feladatazonosítóként kezeli a parancs, és az adott feladatra vonatkozó információkat listázza ki. Ha az opcióbetu után nem szerepel érték, vagy az all szócska áll, az adott opcióval kapcsolatos valamennyi nyomtatási feladatot kilistázza az lpstat. Az lpstat legfontosabb opciói a következok: -a [list] Kiírja, hogy a megnevezett nyomtatók, illetve nyomtatási osztályok

fogadnak-e nyomtatási kérelmeket. list a nyomtatók és nyomtatási osztályok neveit tartalmazza.

-c [list] A nyomtatási osztályok neveit írja ki, továbbá a hozzájuk tartozó nyomtatókat.

-d A default nyomtatót, illetve nyomtatási osztályt adja meg. -f [list] [-l] A listában megnevezett nyomtatványformákat ellenorzi, hogy ismeri-e

oket a nyomtatási alrendszer. A -l opció hatására a nyomtatványformák leírását is kilistázza.

-o [list] A nyomtatási feladatok állapotát jelzi ki. A -o opció el is maradhat. A lista tartalmazhat vegyesen nyomtató és nyomtatási osztály neveket, továbbá feladatazonosítókat.

-p [list] [-D] [-l] A listában megnevezett nyomtatók állapotát jelzi ki. -D és -l hatására részletesebb státuszinformációt szolgáltat.

-r A nyomtatásütemezo háttérprogram (LP scheduler) állapotát írja ki. -R A megnevezett feladatnak a nyomtatási sorban elfoglalt helyzetét adja

meg. -s Részletes státuszinformációkat ad az ütemezorol, a default nyomtatóról, az

egyes nyomtatási osztályokról és azok tagjairól, a nyomtatókhoz rendelt

Page 237: unix kézkönyv

Függelék Permutált index

239

fizikai perifériákról, a nyomtatványformákról és a használható karakter-készletekrol.

-S [list] [-l] A listában felsorolt karakterkészletek illetve írófejek hozzáférhetoségét ellenorzi le. A -l opció hatására mindegyik készlethez kiírja az azt kiszolgálni képes nyomtatók listáját is.

-t Teljesköru státuszinformációt ad, a -s opció által szolgáltatott adatokon kívül az összes printer üzemkészségi állapotát is kiírja.

-u [login-id-list] A listában szereplo felhasználók nyomtatási feladataira vonatkozó információkat listázza. A felhasználók mind lokális, mind távoli gépeken lévo felhasználók lehetnek, utóbbi esetben a host!user megadással hivatkozhatunk rájuk.

-v [list] Az egyes nyomtatókat és a hozzájuk tartozó fizikai perifériákat listázza ki.

BSD rendszerek

BSD alapú UNIX rendszerekben a felhasználó számára fontos nyomtatási parancsok az lpr (fájl kiküldése a nyomtatónak), az lpq (a nyomtatási sor lekérdezése) és az lprm (job törlése a nyomtatási sorból).

Az lpr parancs

E paranccsal lehet a fájlokat a nyomtatónak kiküldeni, illetve a különféle nyomtatási opciókat beállítani. Hívási formája:

lpr [options] [file(s)...]

Ha nem adunk meg fájlnevet, a standard inputot olvassa. A legfontosabb opciók a következok: -P printer A megnevezett nyomtatóra küldi a fájlt; ennek hiányában a PRINTER

környezeti shell-változóban megadott, illetve a default nyomtatóra. -#n n példányban nyomtatja a fájl(oka)t. -C class A feladatazonosító szövegként class fog megjelenni a nyomtatási

fedlapon, nem a küldo gép neve. -J job Nem az elso megadott fájl nevét, hanem a job szöveget írja ki

azonosítónak a nyomtatási fedlapon. -T title A title szöveget írja ki azonosítónak a nyomtatási fedlapra. -i [indent] A kimenetre indent szóközzel beugratva nyomtat. (A default 8.) -w cols cols karakteres lapszélességet tételez fel. -m A nyomtatás befejeztekor levelet küld a felhasználónak. -h Nem nyomtat fedlapot (banner page). -s Nem másolja be a nyomtatási adatterületre (spooling area) a nyomtatandó

fájlokat, hanem az eredeti példánnyal dolgozik.

Page 238: unix kézkönyv

UNIX felhasználói ismeretek

240

-filter Az alábbi egybetus opciókkal lehet szurot definiálni a nyomtatáshoz. A nyomtatandó fájlok eloször a megfelelo szuron haladnak át, s csak utána kerülnek a nyomtatási adatterületre. A használható szurok listája erosen rendszerspecifikus, az alábbiak csak a leggyakoribbak.

-p A fájlokat a pr parancshoz hasonlóan formázza. -t troff formátumú fájlokhoz. -d TeX formátumú fájlokhoz.

(Számos régi lpr implementációban nem engedélyezett az opciók egybeírása, tehát például az lpr -fs megadási mód.)

Az lpq parancs

Az lpq paranccsal lehet a nyomtatási sor tartalmát megjeleníteni. Paraméter nélkül meghívva a sorban álló összes nyomtatási feladatot kilistázza, egyébként az alábbi opciók segítségével lehet egyes kiválasztott feladatokról (job#), vagy az egy adott user felhasználóhoz tartozó nyomtatási feladatokról információt kapni.

lpq [options] [job#] [user]

Az opciók az alábbiak: -P printer A printer nyomtató nyomtatási sorát adja meg, ennek hiányában a

PRINTER környezeti shell-változó, illetve a default printer sorát. -l Részletesebb listát ad a nyomtatási feladatokról, a küldo gép nevét is

kiírva. + [interval] Periodikusan kilistázza a sort, amíg teljesen el nem fogy. interval a

lekérdezések közti ido (másodpercekben).

Page 239: unix kézkönyv

Függelék Permutált index

241

Az lprm parancs

E paranccsal lehet nyomtatási feladatokat törölni a nyomtatási sorból.

lprm [options] [job#] [user]

A feladatokat törölhetjük a feladatazonosító (job#) megadásával, illetve a felhasználó nevének megadásával az adott felhasználóhoz tartozó összes feladat törlodik a sorból. Argumentum nélkül meghívva az lprm parancsot, az éppen aktív feladat törlodik, feltéve hogy mi indítottuk, tehát van törlési jogosultságunk. Az opciók: -P printer A printer nyomtató nyomtatási sorából törli a feladatokat, ennek

hiányában a PRINTER környezeti shell-változó által meghatározott, illetve a default printer sorából.

- A felhasználó által indított összes nyomtatási feladatot törli a sorból. Ha privilégizált felhasználó adja ki e parancsot, az összes nyomtatási feladat törlodik.

Archiválás, mentés A UNIX rendszer üzemeltetésének szerves és nélkülözhetetlen részét képezi az állományrendszerek rendszeres archiválása, mentése. Ez természetesen a rendszeradminisztrátor gondja és kötelessége, de a mindennapi életben gyakran elofordulnak olyan szituációk, amikor a felhasználónak is szüksége van arra, hogy állományait valamilyen hordozható médiára mentse, akár a biztonság növelése céljából, akár azért, mert máshova kell telepítenie. E szakaszban hangsúlyozottan ezen utóbbi problémával foglalkozunk, és nem érintjük azokat a parancsokat, amelyek kifejezetten teljes állományrendszerek mentésére szolgálnak. Az általunk érintett parancsok a cpio, a tar és a dd. Majdnem minden rendszer kínál ezeken kívül újabb és többet tudó parancsokat, ezekkel csak egy gond van, de az annál nagyobb - nem elterjedtek és nem kompatibilisek egymással. E három parancs viszont minden gépen hozzáférheto, ezért tárgyalásunkban ezekre szorítkozunk.

A cpio parancs

A cpio parancs három üzemmóddal rendelkezik, ezeket az elso opcióbetuvel adjuk meg. cpio -ooptions cpio -ioptions pattern cpio -poptions dir cpio -o hatására a standard bemenetrol egy fájlneveket tartalmazó listát olvas, s ezekbol a fájlokból készít archivumot a standard kimenetre. Az archivumú fájl orzi az eredeti

Page 240: unix kézkönyv

UNIX felhasználói ismeretek

242

állományok teljes elérési útvonalát, s minden eredeti fájlinformációt (tulajdonosok, hozzáférési jogok stb). cpio -i hatására a standard inputról az általunk megadott mintára illeszkedo fájlokat olvassa be. A cpio a standard bemenetet egy megelozo cpio -o parancs eredményének tételezi fel, ha más formátumú bemenetet olvas, a beolvasás sikertelen. A beolvasandó fájlok nevének megadásához a shell fájlnév behelyettesítésben használható metakarakterei is megadhatóak, tehát a '?*[ ]' karakterek, valamint a '!' karakter, ami negálást jelent. Ha nem adunk meg fájlnév mintát, a cpio az archivum összes fájlját beolvassa. A beolvasott fájlokat a munkakatalógusban hozza létre, az archivumban tárolt nevekkel, de alapértelmezésben csak akkor, ha az archivumban lévo fájl újabb, mint a gépen lévo változat. A beolvasott állomány módjai az archivumra kimentett állományénak felelnek meg, a tulajdonos és a csoport azonban a cpio parancsot futtató felhasználóéval lesz azonos. Ez alól kivétel az, ha privilégizált felhasználóként dolgozunk, ekkor megmarad az archivumon tárolt tulajdonos és csoport információ. A -a opció visszaállítja az archivum szerinti elérési, -m pedig a módosítási idot. cpio -p hatására a standard inputról katalógus és fájlnevek listáját olvassa, a megnevezett állományokat pedig a megadott katalógus alá helyezi el. Az alábbi példában a munkakatalógus alatti állományrendszert hajlékonylemezre mentjük, majd szintén a cpio paranccsal, visszaolvassuk:

find . -print | cpio -oBvc >/dev/rfd0

cpio -iBvcam </dev/rfd0

A mentésnél a find parancs szolgáltatta a fájlnevek listáját, amelyekbol az archivum készült; az archivumfájlt a standard kimenet átirányításával helyeztük a hajlékonylemezre. Visszamentésnél az archivumfájl beolvasása egy menetben hozza létre a szükséges fájlokat és katalógusstruktúrákat.

Az alábbi példában teljes katalógusstruktúrákat másolunk a newdir katalógusba:

find . -depth -print | cpio -pdlmv newdir

Nagy erénye a cpio-nak a többi archiváló paranccsal szemben, hogy lehetové teszi a több adathordozóra történo mentést, ha az adatok egy lemezre nem férnek rá. Az elso lemez beteltekor az alábbi figyelmeztetést írja ki: "If you want to go on, type device/file name when ready." Újra be kell gépelni a perifériaegység nevét, s a mentés/visszaállítás a következo lemezrol folytatódik.

A cpio legfontosabb opciói a következok: -a Hozzáférési idoket állítja vissza. -A A fájlokat hozzáfuzi a már létezo archivumhoz. Csak a -O opcióval

együtt, és fájlformátumú, vagy lemezen lévo archivumoknál alkalmazható. -b Szavanként megcseréli a bájtokat. Csak az -i opció esetén használható. -B ha karakter típusú eszközmeghajtót adtunk meg perifériaként, 10 blokkos

egységekben ír a perifériára. (lásd -C opció)

Page 241: unix kézkönyv

Függelék Permutált index

243

-c ASCII formátumú fejléceket generál az archivumhoz (akkor van jelentosége, ha eltéro architekturájú gépek közt akarjuk az archiv fájlt mozgatni).

-C size A blokkméretet határozza meg (bájtokban mérve). A default 1 blokk, azaz 512 karakter.

-d Szükség esetén létrehozza a nem létezo katalógusokat. -E file file tartalmazza az archivumból visszamentendo katalógusok és fájlok

listáját. -f A megadott mintákat nem tartalmazó fájlokat menti vissza az

archivumból. -I file A megnevezett file perifériáról olvas, ha végzett az elso adathordozóval,

RETURN hatására folytatja a következovel. Csak a -i opcióval együtt használható.

-k Átugorja a rossz fejlécet tartalmazó és sérült fájlokat. Csak a -i opcióval együtt használható.

-l Ahol lehet, másolás helyett láncolást hajt végre. Csak a -p opció esetén hatásos.

-L Követi a szimbolikus láncokat (alapértelmezés szerint nem). -O file A megnevezett file perifériára ír, az adathordozó beteltekor RETURN

hatására folytatja a következo lemezen. Csak a -o opcióval együtt használható.

-r Interaktív módon átnevezi a fájlokat. Egyenként kiírja a fájlneveket, az újsor karakter hatására átlépi az adott fájlt, a '.' (pont) karakter hatására az archivumból visszaállítja az eredeti nevet és elérési utat.

-s Félszavakban cseréli fel a bájtokat. -S Félszavakat cserél fel szavakban. -t Csak az archivum tartalmát listázza ki. -u Feltétel nélkül állítja vissza az állományt, akkor is, ha a gépen lévo

frissebb, mint az archivum. -v Bobeszédu üzemmód, kiírja a fájlok neveit. A -t opcióval kombinálva ls -l

formátumú listázást kapunk.

A tar parancs

A tar parancs, ellentétben a cpio-val, valódi archivumkezelo program, a már archivumban lévo fájlokat törölhetjük, lecserélhetjük vagy frissíthetjük. Másik nagy elony a cpio ellenében, hogy mindig rekurzívan dolgozik, azaz a megadott katalógusnevek az adott pontból induló teljes állományfát jelentik; ennek következtében a kezelendo fájlok megadása sokkal egyszerubb, nem kell egy külön programmal összeszedni azokat. Komoly hiányossága viszont, hogy a többlemezes mentést nem támogatja.3

3 Mindez a legelterjedtebb, szabványos tar implementációra vonatkozik, egyes változatai támogatják a többlemezes mentéseket is.

Page 242: unix kézkönyv

UNIX felhasználói ismeretek

244

A tar parancsnak is számos üzemmódja van, ezeket a parancsnév utáni elso betuvel adjuk meg, ezt a tar speciális zsargonjában kulcsnak (key) hívják, s ezt követik az egyéb opciók. (A '-' karakter kirakása nem kötelezo.)

A tar általános hívási formája a következo:

tar key[options] file(s)...

Az alapveto kulcsok és a hozzájuk tartozó üzemmódok a következok: c Új archivum létrehozása. r A megnevezett fájlokat az archivum végére fuzi. u Archivum frissítése: csak a még nem archivált, vagy az archivumban

szereplonél frissebb fájlokat menti el. x Fájlok visszaállítása az archivumból. t Archivum listázás. Fájlnév hiányában a teljes állományt listázza.

A tar fontosabb opciói az alábbiak: b size Blokkolási tényezo, azt adja meg, hogy hány blokkos egységekben írja az

archivumot a perifériára. (Alapértéke 1, a maximum 20). B Kieroszakolja az adott blokkméretu adatmennyiség olvasását, ha kell,

többszörös olvasási muveleteket végrehajtva. Hálózatról, vagy csövön keresztül olvasva ugyanis nem mindig érkezik teljes blokkméretnyi adat, s ez olvasáskor megbolondíthatja a tar blokkméret felismerését.

f file Az archivum (tarfile) nevét adja meg, ami lehet akár egy periféria meghajtó neve, vagy egy közönséges fájlé. Ha az f opció szerepel, de file nem, a TAPE shell-változó, ennek hiányában pedig a /etc/default/tar fájl által megadott periférianevet használja. A '-' karakterrel lehet a standard ki-, illetve bemenetet megadni.

h Követi a szimbolikus láncokat, mintha közönséges fájlok vay katalógusok lennének. (Alapértelmezés szerint nem követi.)

l Ha nem tudja feloldani az archiválandó fájl által követett láncokat, hibát jelez.

m A visszamentett állományok módosítási idejét felülírja, az archivumban szereplo helyett a visszamentés ideje lesz.

o A visszamentett állományok tulajdonosi és csoport jellemzoit felülírja a tar programot futtató felhasználóéval.

P A visszamentett fájlok hozzáférési jogait az eredetiek szerint állítja be, az érvényes umask beállítást figyelmen kívül hagyva.

v Muveletek közben kiírja az érintett fájlok neveit, s a muveleti kulcsot. w Interaktív módban, minden fájlmuvelet elott visszaigazolást kér. X file A megadott file állomány azon katalógusok és fájlok neveit tartalmazza,

amelyek kimaradnak a tar muveleteibol (cxt). Több X opciót is megadhatunk egy parancsban, de egy X karakterhez csak egy fájlnév argumentum tartozhat.

I file A megadott file állományban szereplo neveket úgy kezeli, mintha parancssori fájlnév argumentumként lettek volna beírva. (A kizáró X

Page 243: unix kézkönyv

Függelék Permutált index

245

felsorolás erosebb mint az I, ezért ha egy fájl mindkét felsorolásban szerepel, ki fog maradni az adott tar muveletbol.

Az alábbi példánál tételezzük fel, hogy a nosave nevu fájl tartalma a következo: /usr/mail /usr/man /usr/share /etc/inet /tmp

Az alábbi parancs kiadásával a teljes állományrendszert szalagra mentjük, a /usr/mail, /usr/man, /usr/share, /etc/inet és /tmp katalógusfák kivételével:

tar cvf /dev/rmt/0h -X nosave /

A fenti példával kapcsolatban egy dologra szeretnénk még felhívni a figyelmet, és ez a relatív elérési utak használatának fontossága. A tar állomány az eredeti elérési útvonalakat megorzi, ha abszolút elérési nevet adtunk, akkor azt, ha relatívot, akkor azt. Tegyük fel, hogy az elobbi példa alapján elmentett anyagunkból csak a /users/demo katalógusfát szeretnénk visszahozni, de valamilyen oknál fogva a /old/users/demo néven. Mivel visszaállításkor is az archivumban lévo elérési utat használja a rendszer, ha a katalógusfát abszolút néven mentettük el, nem tudjuk máshova rakni, mint ahol eredetileg volt! Ezért mindig ügyeljünk arra, hogy a tar által mentendo katalógusfákat reletív módon címezzük, például a fenti példa helyesen így nézne ki:

cd /; tar cvf /dev/rmt/0h -X nosave .

Ennek hatására a /users/demo katalógusfa ./users/demo néven lesz archiválva, s visszamenteni a következoképpen tudjuk az új helyre:

cd /old; tar xvf /dev/rmt/0h ./users/demo

E parancs hatására a /old katalógus alatt létrejön az elmentett teljes /users/demo katalógusfa.

A dd parancs

A dd parancsról már volt szó a segédprogramok között, itt elsosorban azért kerül elo, mert távoli mentések esetén, amikor nem a lokális gépen lévo perifériára mentjük anyagainkat, gyakran használják a távoli periféria kezelésére, az alábbihoz hasonló módon: tar cvfb - 20 . | rsh rhost dd of=/dev/rmt/0m bs=20b

illetve

rsh rhost dd if=/dev/rmt/0m bs=20 | tar xvfbB - 20

A fenti parancssorozatban a munkakatalógust és az az alatti fájlrendszert mentjük el az rhost nevu távoli gépen lévo, /dev/rmt/0n nevu mágnesszalagos egységre, majd vissza. A tar a standard kimenetre küldi a mentendo anyagokat, az rhost távoli gép pedig a standard

Page 244: unix kézkönyv

UNIX felhasználói ismeretek

246

bemenetrol olvassa a mentendo anyagokat, s az of opcióval megnevezett perifériára menti el, 20 blokkos egységekben (ez a maximális blokkméret, s kiváltképpen nagytömegu adatok mentésénél célszeru beállítani, ha az adott periféria ezt támogatja). A tar parancs esetében is beállítottuk a 20 blokkos blokkméretet (-b 20), s a második parancsnál, a visszamentésnél a -B opcióval gondoskodtunk arról is, hogy a csövön keresztül pontosan a megadott blokkméretu csomagok menjenek át. (Ha errol külön nem intézkedünk, a hálózaton, illetve csöveken keresztül nem teljesen feltöltött csomagok is átmehetnének.)

Szükség esetén kihasználhatjuk a dd parancsnak azt a lehetoségét is, hogy eltéro lehet a bemeneti és a kimeneti blokkméret. Ha például az adott periféria támogatja nagyobb blokkméret használatát (jellemzoen a DAT kazettáknál és más nagykapacitású tárolóknál), akkor a dd parancs a dd ibs=20b obs=126b

vagy hasonló opciókkal is használható. (Példánkban 20 blokkos egységekben olvastatunk és 126 blokkos egységekben írunk a médiára. Ne felejtsük, hogy a dd bájtokban számol, a b karakter jelzi a blokkos méretmegadást.)

DOS alapú fájlok és lemezek kezelése Mindennapos igényként merül fel a gyakorlatban, hogy UNIX felhasználóként is képesek legyünk DOS formátumú adatállományok feldolgozására. Két viszonylag egyszeru mód kínálkozik megoldásként. Az egyik, hogy a DOS formátumú hajlékonylemezt becsatoljuk (mountoljuk) a UNIX állományrendszerébe, ezáltal az teljes jogú részévé válik a fájlrendszernek, a továbbiakban gond nélkül használhatóak a szokásos UNIX alatti parancsok a DOS fájlokon is. Elofeltétele ennek a megoldásnak, hogy UNIX-os rendszerünk ismerje a DOS fájlrendszer formátumot - ez, hacsak nem valami ilyen régi UNIX verzióval dolgozunk, általában nem szokott gondot okozni. A probléma ezzel a megközelítéssel az, hogy a becsatolást csak privilégizált felhasználó hajthatja végre. A probléma megkerülésére több megoldás létezik. Az egyik, hogy egy C nyelvu programot kell írni4, ami becsatolja, illetve lecsatolja a DOS-os fájlrendszert, e programot lefordítás után root tulajdonúvá kell tenni és be a set-user-id jogokat engedélyezni kell. Ennek hatására akárki hívja meg e programot, root-ként hajthatja végre a DOS állományrendszer be-, illetve lecsatolását. E gyorstalpaló megoldásnak léteznek szebb változtai is, szabadon hozzáférheto, úgynevezett public domain programok formájában, amik megbízható módon gondoskodnak a floppy (és CD-ROM!) hozzáférés kezelésérol. Ilyen programok installálása a rendszergazda feladata.

A másik megoldás, amit például a SunOS 5.x (SVR4 kompatibilis) változata kínál, hogy a fenti problémát felismerve átalakítják az operációs rendszert a cserélheto adathordozók

4 Azért C nyelvû programot az egyszerûbb shell script helyett, mert egyes rendszerekben – biztonsági okokból – shell script nem kaphat set-uid jogosultságokat, csak bináris végre- hajtható állomány.

Page 245: unix kézkönyv

Függelék Permutált index

247

használatának speciális igényeit figyelembe véve: e rendszerben a kernel automatikusan detektálja egy floppy vagy CD-ROM behelyezését és automatikusan becsatolja az adathordozót az állományrendszerbe.

DOS konverziós segédprogramok

Számos UNIX rendszer, kivált az IBM PC alapúak, a DOS formátumú fájlok kezelésére külön parancsokat is kínál. E parancsok neve és szintaktikája erosen eltéro lehet, általában a "dos" szócska szerepel a nevükben, például dosdir, doscopy, dosdel, stb. Éppen a lehetséges változatok nagy száma miatt ezekkel nem foglalkozunk részletesebben, csak azért sem, mert minden szempontból az elozo megoldás az elonyösebb, a DOS fájlrendszer becsatolása a UNIX alá.

Egy parancsról azonban mindenképp meg kell itt emlékeznünk, s ez a dos2unix5 (illetve párja, a unix2dos), amely a DOS-UNIX fájkonverziót hajtja végre. A két fájlformátum között alapvetoen két különbség van: a DOS alatt a sorvégét a CR-LF karakterpáros jelzi, míg UNIX alatt csak az LF karakter; a másik pedig a DOS alatt a fájlvég jelzésére szolgáló CTRL-Z karakter, aminek a UNIX alatt nincsen megfeleloje. A dos2unix, illetve a unix2dos parancs szuroként muködik és a megfelelo irányú fájlkonverziót hajtja végre.

5 A név a DOS-to_Unix szó szándékos fonetikus "félrehallásából" ered.

Page 246: unix kézkönyv

248

FÜGGELÉK

Mivel főzzünk, avagy permutált index magyarosan

A UNIX dokumentációk egyik vonzó részlete, az úgynevezett permutált index, amiből az olvasó, abc sorrendben rendezett felsorolásban találja a parancsokat és a leírásukat. Így könnyen segíteni tud magán, ha azt keresi, hogy adott feladat végrehajtásához talál-e UNIX parancsot. Ezt igazán "angolosan", már csak a magyar nyelv sajátosságai miatt sem tudjuk megvalósítani. Helyette, lévén az egyik szerző egyben háziasszony is, a receptkönyvekből ismert mit-mihez, mivel-mit felsorolást választottuk.

Mivel-mit tehetünk

cat állományok olvasása és egymás után fűzése cd munkakatalógus cseréje chgrp állomány, katalógus csoportazonosítójának változtatása chmod állományok, katalógusok használati engedélyeinek változtatása chown állomány, katalógus tulajdonosának változtatása cmp állományok összehasonlítása comm két állomány közös sorainak kiválasztása cp állományok másolása cpio állományok archiválása, visszaállítása cut mezők kivágása egy állomány soraiból. date dátum és idő beállítása vagy lekérdezése dd állományok másolása, konvertálása expr argumentumok kiértékelése kifejezésként file állományok tartalmának típusmeghatározása find állományok keresése a katalógusrendszerben grep minta keresése állományban ln állományok linkelése ls katalógusok tartalmának listázása mail levél küldése felhasználóknak mesg üzenetek képernyőn megjelenítésének engedélyezése mkdir új katalógus létrehozása mount katalógusrendszerek becsatolása a fájlrendszerbe.

Page 247: unix kézkönyv

Függelék Permutált index

249

more állomány tartalmának kiírása a terminálra mv állományok áthelyezése nohup indított folyamatok futtatása a felhasználó kilépése után od állományok oktális dumpolása passwd password attribútumainak megváltoztatása pg állomány listázása a képernyőre pr állományok nyomtatása ps futó folyamatok állapotinformációi pwd munkakatalógus nevének kiírása rm állományok törlése rmdir katalógusok törlése rsh UNIX parancsértelmező csökkentett lehetőségekkel rsh távoli gépeken futó UNIX parancsértelmező set változók és opciók beállítása sh UNIX parancsértelmező sleep parancsvégrehajtás késleltetése sort állományok tartalmának rendezése split állományok tartalmának szétdarabolása stty terminál paramétereinek beállítása su belépés szuperuser módba tail állományok tartalmának szétdarabolása tar archiválás mágnesszalagra umount katalógusrendszerek lecsatolása filerendszerről. uniq állományok azonos sorainak kiirtása unset változók, opciók értékének törlése wc sorok, szavak, karakterek számlálása who bejelentkezett felhasználók listája

Mit használjunk, ha csak a cél ismert

állapotinformációi (futó folyamatok ...) ..................................................... ps állomány közös sorainak kiválasztása (két ...) .....................................comm állomány listázása a képernyőre.................................................................... pg állomány soraiból. (mezők kivágása egy ...) .............................................cut állomány tartalmának kiírása a terminálra .............................................. more állomány, katalógus csoportazonosítójának változtatása ....................... chgrp állomány, katalógus tulajdonosának változtatása .................................. chown állományban (minta keresése ...) ............................................................. grep állományok archiválása, visszaállítása ...................................................... cpio állományok áthelyezése................................................................................mv állományok azonos sorainak kiirtása ........................................................ uniq állományok keresése a katalógusrendszerben ........................................... find állományok linkelése ..................................................................................... ln

Page 248: unix kézkönyv

UNIX felhasználói ismeretek

250

állományok másolása .................................................................................... cp állományok másolása, konvertálása .............................................................dd állományok nyomtatása ................................................................................ pr állományok oktális dumpolása ..................................................................... od állományok olvasása és egymás után fűzése ............................................... cat állományok összehasonlítása .....................................................................cmp állományok tartalmának rendezése .............................................................sort állományok tartalmának szétdarabolása ....................................................split állományok tartalmának szétdarabolása ......................................................tail állományok tartalmának típusmeghatározása ..............................................file állományok törlése ...................................................................................... rm állományok, katalógusok használati engedélyeinek változtatása ..........chmod archiválás mágnesszalagra ........................................................................... tar archiválás, visszaállítás (állományok ...) ................................................. cpio argumentumok kiértékelése kifejezésként .................................................expr áthelyezés (állományok ...) ........................................................................mv attribútumok megváltoztatása (password ...) ......................................passwd azonos sorok kiirtása (állományok ...) .................................................... uniq beállítás (terminál paramétereinek ...) ......................................................stty beállítás (változók és opciók ...) .................................................................set beállítás vagy lekérdezés (dátum és idő ...) .............................................date becsatolás a fájlrendszerbe. (katalógusrendszerek ...) ............................ mnt bejelentkezett felhasználók listája ............................................................. who belépés szuperuser módba ............................................................................ su csere (munkakatalógus ...) ......................................................................... cd csökkentett lehetőségekkel (UNIX parancsértelmező ...) .........................rsh csoportazonosító változtatása (állomány, katalógus ...) ....................... chgrp dátum és idő beállítása vagy lekérdezése ..................................................date dumpolás (állományok oktális ...) .............................................................. od engedély változtatása (állományok, katalógusok használati ...) ..........chmod engedélyezés (üzenetek képernyőn megjelenítésének ...) ......................mesg érték törlése (változók, opciók ...) ......................................................... unset fájlrendszerbe. (katalógusrendszerek becsatolása a ...) .......................... mnt felhasználók listája (bejelentkezett ...) .................................................... who felhasználóknak (levél küldése ...) .........................................................mail fájlrendszerről. (katalógusrendszerek lecsatolása ...) ........................... umnt folyamatok állapotinformációi (futó ...) ..................................................... ps folyamatok futtatása a felhasználó kilépése után (indított ...) ............. nohup futó folyamatok állapotinformációi .............................................................. ps futó UNIX parancsértelmező (távoli gépeken ...) ......................................rsh futtatás a felhasználó kilépése után (indított folyamatok ...) ............... nohup felfűzés (állományok olvasása egymás után ...) ........................................ cat használati engedélyek változtatása (állományok, katalógusok ...) ......chmod idő beállítás vagy lekérdezés (dátum és ...) .............................................date indított folyamatok futtatása a felhasználó kilépése után ..................... nohup

Page 249: unix kézkönyv

Függelék Permutált index

251

karakterek számlálása (sorok, szavak, ...) ...................................................wc katalógus csoportazonosítójának változtatása (állomány, ...) .............. chgrp katalógus létrehozása (új ...) .................................................................mkdir katalógus tulajdonosának változtatása (állomány, ...) ......................... chown katalógusok használati engedélyeinek változtatása (állományok, ...) .chmod katalógusok tartalmának listázása ..................................................................ls katalógusok törlése .................................................................................rmdir katalógusrendszerek becsatolása a fájlrendszerbe. ................................ mount katalógusrendszerek lecsatolása filerendszerről. .................................umount képernyőn megjelenítések engedélyezése (üzenetek ...) ........................mesg képernyőre (állomány listázása a ...) .......................................................... pg keresés a katalógusrendszerben (állományok ...) .................................... find keresés állományban (minta ...) .............................................................. grep késleltetés (parancsvégrehajtás ...) .........................................................sleep két állomány közös sorainak kiválasztása ..............................................comm kiértékelés kifejezésként (argumentumok ...) ..........................................expr kifejezésként (argumentumok kiértékelése ...) ........................................expr kiírás (munkakatalógus nevének ...) ........................................................pwd kiírás a terminálra (állomány tartalmának ...) ....................................... more kiirtás (állományok azonos sorainak ...) ................................................. uniq kilépés után (indított folyamatok futtatása a felhasználó ...) ............... nohup kivágás egy állomány soraiból. (mezők ...) ...............................................cut kiválasztás (két állomány közös sorainak ...) .......................................comm konvertálás (állományok másolása, ...) ......................................................dd közös sorok kiválasztása (két állomány ...) ..........................................comm lecsatolás filerendszerről. (katalógusrendszerek ...) ............................. umnt lekérdezés (dátum és idő beállítása vagy ...) ...........................................date létrehozás (új katalógus ...) ...................................................................mkdir levél küldése felhasználóknak ...................................................................mail linkelés (állományok ...) .............................................................................. ln lista (bejelentkezett felhasználók ...) ....................................................... who listázás (katalógusok tartalmának ...) ...........................................................ls listázás a képernyőre (állomány ...) ............................................................ pg mágnesszalagra (archiválás ...) .................................................................. tar másolás (állományok ...) ............................................................................. cp másolás, konvertálás (állományok ...) ........................................................dd megjelenítések engedélyezése (üzenetek képernyőn ...) ........................mesg mezők kivágása egy állomány soraiból. ......................................................cut minta keresése állományban ..................................................................... grep munkakatalógus cseréje ................................................................................ cd munkakatalógus nevének kiírása ...............................................................pwd név kiírása (munkakatalógus ...) ..............................................................pwd nyomtatás (állományok ...) ......................................................................... pr oktális dumpolás (állományok ...) .............................................................. od olvasás és egymás után fűzése (állományok ...) ........................................ cat

Page 250: unix kézkönyv

UNIX felhasználói ismeretek

252

opciók beállítása (változók és ...) ...............................................................set opciók értékének törlése (változók, ...) ................................................. unset összehasonlítás (állományok ...) ..............................................................cmp paraméterek beállítása (terminál ...) .........................................................stty parancsértelmező (távoli gépeken futó UNIX ...) ......................................rsh parancsértelmező (UNIX ...) ...................................................................... sh parancsértelmező csökkentett lehetőségekkel (UNIX ...) .........................rsh parancsvégrehajtás késleltetése ................................................................sleep password attribútumainak megváltoztatása ..........................................passwd rendezés (állományok tartalmának ...) ......................................................sort sorok kiirtása (állományok azonos ...) .................................................... uniq sorok, szavak, karakterek számlálása ...........................................................wc számlálás (sorok, szavak, karakterek ...) ....................................................wc szavak, karakterek számlálása (sorok, ...) ...................................................wc szétdarabolás (állományok tartalmának ...) .............................................split szétdarabolás (állományok tartalmának ...) ...............................................tail szuperuser módba (belépés ...) ................................................................... su tartalom kiírása a terminálra (állomány ...) ........................................... more tartalom listázása (katalógusok ...) ...............................................................ls tartalom rendezése (állományok ...) .........................................................sort tartalom szétdarabolása (állományok ...) .................................................split tartalom szétdarabolása (állományok ...) ...................................................tail tartalom típusmeghatározása (állományok ...) ...........................................file távoli gépeken futó UNIX parancsértelmező ..............................................rsh terminál paramétereinek beállítása .............................................................stty terminálra (állomány tartalmának kiírása a ...) ...................................... more típusmeghatározás (állományok tartalmának ...) .......................................file törlés (állományok ...) ................................................................................ rm törlés (katalógusok ...) ..........................................................................rmdir törlés (változók, opciók értékének ...) ................................................... unset tulajdonos változtatása (állomány, katalógus ...) ................................ chown új katalógus létrehozása .........................................................................mkdir UNIX parancsértelmező ............................................................................... sh UNIX parancsértelmező (távoli gépeken futó ...) ......................................rsh UNIX parancsértelmező csökkentett lehetőségekkel ..................................rsh üzenetek képernyőn megjelenítésének engedélyezése .............................mesg változók és opciók beállítása ........................................................................set változók, opciók értékének törlése .......................................................... unset változtatás (állomány, katalógus csoportazonosítójának ...) ................ chgrp változtatás (állomány, katalógus tulajdonosának ...) ........................... chown változtatás (állományok, katalógusok használati engedélyeinek ...) ...chmod visszaállítás (állományok archiválása, ...) ............................................... cpio

Page 251: unix kézkönyv

253

FÜGGELÉK

Mini manuál

Mini manuálunk főként az angolul egyáltalán nem tudók kedvéért készült. Nem tartalmaz minden UNIX parancsot. A feldolgozott parancsokat ábécé sorrendben közöljük. A szintaktikus alak megadásánál azzal a szokásos jelölésmóddal élünk, hogy az opcionális részeket szögletes zárójel pár közé zárjuk. Az egy közös minus jel mögé csoportosítható opciókat közös zárójel párba tesszük, a másikakat nem.

cat Feladata, hogy állományok tartalmát olvassa és egymás után a standard outputra küldje őket.

Szintaktikus alakja cat [-u] [-s] [-v [-t] [-e]] file...

A cat parancs legfontosabb opciói -u Buffereletlen outputot generál. -s Nem kapunk hibaüzenetet hiányzó állományok esetén. -v A nem nyomtatható karaktereket (a tabulátor, a kocsivissza és a soremelés

kivételével) olvasható formában jeleníti meg (a hexa 0-20 közti karaktereket a közismert ^n jelöléssel, az egyéb nem nyomtathatóakat pedig M-n formában, ahol n az alsó 7 bitnek megfelelő karakter.

A -v opció használata mellett az alábbiak is használhatóak: (lásd szintaktikus jelölést) -t A tabulátorokat és a lapdobásokat is olvasható formában jeleníti meg (^I,

illetve ^L). -e Minden sor végén, az újsor karakter előtt egy $ karaktert nyomtat.

cd Feladata katalóguscsere végrehajtása.

Page 252: unix kézkönyv

UNIX felhasználói ismeretek

254

Szintaktikus alakja cd [katalógus]

A katalógus helyén állhat egy abszolút vagy relatív útvonal, vagy egy környezeti változó tartalma, vagy semmi. Ez utóbbi esetben a $HOME érték helyettesítődik be.

chgrp Feladata, hogy az állomány vagy katalógus csoportazonosítóját változtassa.

Szintaktikus alakja chgrp csoport név

Ahol a csoport az új csoport neve, a név pedig az állomány vagy a katalógus neve.

Page 253: unix kézkönyv

Függelék Mini manual

255

chmod Feladata az állományokra, illetve katalógusokra vonatkozó írás-olvasási-végrehajtási jogok változtatása. Csak az állomány tulajdonosa, illetve a szuperuser az aki a fenti jogokat változtathatja.

Szintaktikus alakja

Kétféle szintaktikus alakja létezik. Abszolútnak nevezett az alábbi: chmod mód név

Szimbolikus változtatásnak nevezik az alábbi szintaktikus alakot: chmod [kinek]operátor engedélyek név

Ahol mód három vagy négy oktális számjegy: "dabc". Az a értéke az alábbi: 1 jelenti, hogy az állomány végrehajtható, 2, hogy

írható, 4, hogy olvasható az állomány tulajdonosa számára, és ezen értékek VAGY-olt alakjai is értelmezettek.

A b a tulajdonossal egy csoportban lévők, c a rendszerben létező bármely felhasználó jogait mutatja, az értékek hasonlóan értelmezendők, mint a tulajdonos esetén.

A d értékét csak a szuperuser állíthatja. Ha értéke 1, akkor az úgynevezett "sticky bit"-et kapcsoljuk be, aminek hatása, hogy a parancs szövegét a memóriából, a parancs lefutása után csak akkor söpri ki a swap, ha a szabad terület az alsó határ alá csökken. Ha értéke 2, akkor a "set GID" bitet, ha 4 akkor a "set UID" bitet állítja be. Ha a "set" bitek hatására a felhasználó, vagy a vele egy csoportban lévő ugyanazokat a jogokat kapja, mint az állomány tulajdonosa. ( Képzeljük el, mi történik, ha egy rendszerparancsnak az alábbi engedélyei vannak: -rwsrwxrwx. )

Page 254: unix kézkönyv

UNIX felhasználói ismeretek

256

név az állomány vagy a katalógus neve. kinek az a felhasználói szimbólum akinek a jogait változtatják. Ez lehet u, ha a

userről van szó, g, ha a csoportról van szó, és o, ha a többi felhasználóról van szó.

operátor a plusz vagy a mínusz jel, attól függően, hogy hozzáadjuk, vagy elvesszük az adott jogot.

engedélyek a w (írás), r (olvasás), x (végrehajtás) engedélye.

chown Feladata, hogy az állomány vagy a katalógus tulajdonosát változtassa.

Szintaktikus alakja chown tulaj név

A tulaj az új tulajdonos bejelentkezési neve vagy felhasználói azonosítója. A név az állomány vagy a katalógus neve.

Ezt a műveletet, hasonlóan a chgrp művelethez, csak az állomány vagy katalógus tulajdonosa vagy a szuperuser hajthatja végre.

cmp

Feladata, hogy két állományt összehasonlítva, csak akkor adjon outputot, ha különbözőséget talál. Ebben az esetben az eltérés helyének bájt és sorszámát is kijelzi. Észreveszi, ha az egyik állomány a másiknak első fele.

Szintaktikus alakja cmp [-s] file1 file2

Ha az exit változó értéke 0 A két állomány azonos. 1 A két állomány különböző 2 Hibás, vagy el nem érhető parancsargumentum.

A cmp parancs legfontosabb opciói

Page 255: unix kézkönyv

Függelék Mini manual

257

-s Nem ír ki semmit, csak a visszatérési értéke jelzi, hogy azonos-e a két állomány.

comm Feladata, hogy kezdőbetűik szerint alfabetikus sorrendbe rendezett sorokból álló két ASCII kódú állományból szétválassza, és külön külön oszlopban kiírja a csak ez elsőben, csak a másodikban és a mindkettőben előforduló sorokat.

Szintaktikus alakja comm [-[123]] file1 file2

A comm parancs legfontosabb opciói

A comm parancs opciói az általános gyakorlattól eltérően nem betűk hanem számok. -123 A megfelelő opciók tetszőleges egy vagy kétszámjegyű kombinációja

szerepelhet, mindegyik a megfelelő számú oszlop nyomtatását tiltja le. Például -3 a közös sorok nyomtatását tiltja.

Page 256: unix kézkönyv

UNIX felhasználói ismeretek

258

cp, ln, mv Feladatuk rendre, hogy állományt másoljon, linkeljen, vagy áthelyezzen.

Szintaktikus alakjuk cp [-i][-p][-r] állomány1... cél ln [-fs] állomány1... cél mv [-f][-i] állomány1... cél

A cél lehet állománynév, vagy cp és mv esetében katalógusnév is, de ha állománynév, akkor annak előzetes tartalma törlődik. Az mv parancs esetén állomány1 is lehet katalógus, ez egy katalógus átnevezését jelenti.

Az cp, ln és mv parancs opciói -i Interaktív mód. Megkérdezi, hogy tegye-e, mielőtt egy fájlt

felülír.(y=igen) -p Megőrzi, illetve örökíti az eredeti fájl hozzáférési jogait és módosítási

idejét. -r Ha állomány1 katalógus, akkor az egész katalógust a benne lévő

alkatalógusokkal együtt másolja. Feltétel, hogy a cél is katalógus legyen. -f Ha írásvédett állomány a cél, a parancsok hibát jeleznek, kivéve, ha ez az

opció be van kapcsolva. -s Csak ln parancs esetén. Hatására szimbolikus link keletkezik.

Page 257: unix kézkönyv

Függelék Mini manual

259

cpio Feladata, hogy kiválasztott állományokat archiváljon, illetve archiváltakból, akár szelektíven állományokat elővegyen. Ennek megfelelően a cpio parancsnak három üzemmódja van: cpio -o A standard bemenetről olvas egy állomány listát és a standard kimenetre

készíti az archívumot. Az archívumban az állományok minden fontos tulajdonsága el van mentve, úgy mint az eredeti path és a státusinformációk. Az archivum blokkokból épül fel, egyéb rendelkezés hiányában a blokkok hossza 512 byte.

cpio -i minta A standard bemenetet egy előző cpio -o paranccsal készített archívumnak tekinti és ebből a minta, mint állománynév, által specifikált állományokat olvassa be. A minta egy reguláris kifejezés. Minta hiányában az összes archivált állományt megpróbálja beolvasni. A beolvasás csak akkor történik meg ha az archívumban lévő állomány újabb mint a gépen lévő azonos nevű változata. A beolvasott állomány módjai az archívumra kimentett ál-lománynak felelnek meg, tulajdonosa és csoportja azonban a cpio parancsot elindító felhasználójáéval lesz azonos, ha az nem a superuser. Ha a fel-használó a superuser akkor megmarad az archívumon tárolt tulajdonos és csoport. A beolvasott állományok engedélyei az elmentett állomány engedélyeivel lesznek azonosak.

cpio -p katalógus A standard bemeneten felsorolt állományokat az adott katalógusba másolja át.

Szintaktikus alakja cpio -o[acBvV] [-C bufméret] [[-O file] [-M üzenet] cpio -i[BcdmrtuvVfsSb6] [-C bufméret] [[-I file] [-M üzenet] [minta] cpio -p[adlmuvV] katalógus

Figyelem, ne feledkezzünk meg arról, hogy a cpio mindig a standard bemenetről vár parancsot.

A cpio parancs legfontosabb opciói

a visszaállítja az archívum szerinti elérési időt (access time), m visszaállítja a módosítási időt (modification time).

Tehát, ha az eredeti állományokat akarjuk visszaállítani akkor superuser-ként kell dolgoznunk (vagy az állományok eredeti felhasználójaként) és használnunk kell a -am argumentumokat. u (unconditional) argumentumot használjuk, ha az állomány(oka)t akkor is

felül akarjuk írni, ha azok fiatalabbak mint az archivumban lévők.

Page 258: unix kézkönyv

UNIX felhasználói ismeretek

260

c ASCII fejlécet készít az archívumban a hordozhatóság érdekében B karakter meghajtó esetében blokkokat ír, illetve olvas a cpio t az archívumnak csak a tartalmát kell kilistázni v „bőbeszédű” üzemmód (verbose) -I "file" Ha a "file", amiről olvas egy karakteres berendezés, akkor a tartalmának

végigolvasása után, kicserélhetjük a médiumot, népszerűbben szólva a lemezt egy ugyan olyan típusúra, és egy ENTER leütése után folytathatjuk a beolvasást. Csak az -i opció mellett lehet használni ezt az opciót.

-O "file" az -I opcióéval azonos a "file" értelmezése, csak írás esetére. Csak a -o opció mellett lehet használni.

-d ha beolvasáskor vagy katalógusba másoláskor (-p) katalógusokat is létre kell hozni, akkor a -d opció nélkül a cpio erre nem képes.

Page 259: unix kézkönyv

Függelék Mini manual

261

cut Feladata, hogy mezőket vágjon ki egy állomány soraiból.

Szintaktikus alakja

Attól függően, hogy hogyan határozzuk meg a kivágandó mező, kétféle hívása lehet a parancsnak. Az egyik esetben a mezőt karakterpozícióval definiálhatjuk: cut -clista [állomány ...]

A másik esetben mezőelválasztó karaktert használunk, tetszőleges karakterpozícióban, és az így meghatározott mezőkből vágunk ki néhányat. cut -flista [-dkarakter] [-s] [állomány ...]

A lista lehet vesszővel elválasztott felsorolás, vagy egy tartomány, vagy a kettő kombinációja. (Például 1,3,5-8).

A - állománynév a standard inputra utal.

Az cut parancs legfontosabb opció

-clista az opciót követő lista mondja meg, hogy melyik karakterpozíciókat kell kivágni

-flista az opciót követő lista mondja meg, hogy melyik mezőket kell kivágni. -dkarakter az opciót követő karakter lesz a mezőelválasztó. Alapesetben, ez a szóköz

vagy a tabulátor. -s a mezőelválasztó karakter nélküli sorokat nem engedi át.

A -c illetve -f opció közül legalább egynek kell szerepelnie.

Page 260: unix kézkönyv

UNIX felhasználói ismeretek

262

date Feladata, hogy a pontos dátumot és időt beállíthassuk vagy lekérdezhessük.

Szintaktikus alakja date [ mmddhhpp[yy]][+formátum]

Argumentum nélkül, vagy + jellel kezdődő argumentum esetén a pontos időpontot kapjuk válaszul. Számokkal kezdődő argumentum esetén a számokkal kezdődő argumentum esetén a pontos dátum-idő beállításnak tekinti. A számokat párosával értelmezi, a jelölés alapján: mm a hónap; 01-12 dd a nap; 01-31 hh az óra; 00-23 pp a perc; 00-59 yy az évszám utolsó két jegye; 00-99 Formátum megadásánál az alábbi hivatkozásokat használhatjuk: m hónap számokkal kiírva h hónap betűkkel, Az angol nevek rövidítésével d a nap a hónapon belüli sorszámmal w a nap minta a hét napja sorszámmal. Vasárnap=0-ik nap a a nap mint a hét napja. Az angol nevek rövidítésével y az év utolsó két számjegye. H az óra M a perc S a másodperc D a teljes dátum m/d/y alakban T a pontos idő H:M:S alakban r az AM/PM jelölés n újsor t tabulátor A mezőleírókat egy % jellel kell megelőzni. Például a Dn%H-%M formátum a következő alakban írja ki a választ: (1992 okt 9; 13óra 37 perc) 10/09/92 13-37

dd

Feladata, hogy a megnevezett inputról a megnevezett outputra másoljon (defaultban természetesen a standard input és standard output között), s eközben opcionálisan megadható konverziókat hajtson végre.

Page 261: unix kézkönyv

Függelék Mini manual

263

Szintaktikus alakja dd [ option=value ] ...

A dd parancs legfontosabb opciói

opció értékek if=file A bemeneti állomány neve. of=file A kimeneti állomány neve. ibs=n A bemenetről n bájtos blokkokban olvas (default 512). obs=n A kimenetre n bájtos blokkokban ír (default 512). bs=n Mind a beviteli, mind a kiviteli blokkméretet n bájtra állítja. cbs=n A program belső konverziós bufferének mérete. skip=n n blokkot átugrik a bemeneten, mielőtt másolni kezd. seek=n n blokkot előrelép a kimeneti állományon, mielőtt másolni kezd. count=n Csak n blokkot másol. conv=cvt Az alábbiaknak megfelelően konvertál a bemenet és a kimenet között: ascii EBCDIC kódról ASCII kódra konvertál. ebcdic ASCII kódról EBCDIC kódra konvertál. ibm IBM kódkészletről EBCDIC kódra konvertál. lcase Nagybetűket kisbetűkre konvertál. ucase Kisbetűket nagybetűkre konvertál. swab Szavak bájtsorrendjét cseréli meg. noerror Hiba esetén folytatja a feldolgozást. sync Minden input blokkot ibs szerinti méretre bont illetve kiegészít. ...,... Lehetséges a többszörös, vesszővel elválasztott opció felsorolás.

Alapértelmezésben a számparaméterek bájtban értendőek. A szám után szereplő k b vagy w karakterek 1024, 512, illetve 2 szerinti szorzót jelent (kilobyte, block, word).

diff Feladata, hogy megmondja egy állományról, hogy miben különbözik egy másiktól. Természetesen ASCII kódú állományokat kezel. Kívánságra egy „javító” állományt képez, amit az ed editor fel tud dolgozni.

Szintaktikus alakja diff [-efbh] file1 file2

Page 262: unix kézkönyv

UNIX felhasználói ismeretek

264

Ha az exit változó értéke 0 A két állomány azonos. 1 A két állomány különböző 2 Hibás, vagy el nem érhető parancsargumentum.

A diff parancs legfontosabb opciói

-e ed által végrehajtható script-et generál. -b a sorkezdő és egyéb, blank karaktereket tartalmazó stringeket nem veszi

figyelembe összehasonlításkor. -h gyorsan és nagyméretű állományokra végzi az összehasonlítást, de csak

viszonylag kis változtatásokat képes nyomonkövetni. Nem érvényes alatta a -e opció.

Page 263: unix kézkönyv

Függelék Mini manual

265

echo Feladata, az argumentumának kiküldése a képernyőre.

Szintaktikus alakja echo [arg]

Az argumentum egy karakterlánc, ami tartalmazhat környezeti változót és UNIX parancsot is. Ezek kiértékelését az idézőjelek használatára vonatkozó szabályok befolyásolják. Használható még egy C nyelvéhez hasonló escape szekvencia rendszer is.

expr Feladata, hogy az argumentumait kifejezésnek vegye és kiértékelje azokat, az eredményt pedig a standard outputra írja.

Szintaktikus alakja expr arg

Az egyes kifejezéselemeket szóközökkel kell elválasztani. A shell által is értelmezett metakaraktereket itt is le kell védeni valamelyik idézőjellel, vagy a backslash karakterrel.

Az expr kulcsszavai és operátorai a következőek: expr1 | expr2 Ha expr1 nem nulla és nem nullstring, akkor azt adja vissza, egyébként

expr2-t. expr1 & expr2 Ha expr1 nulla, vagy nullstring, azt adja vissza, egyébként expr2-t.

Page 264: unix kézkönyv

UNIX felhasználói ismeretek

266

expr { =,\>,\>=,... } expr Ha mindkét kifejezés egész szám, akkor a megfelelő algebrai, egyébként

pedig a lexikális összehasonlítás eredményét adja vissza. expr { +,-,\*,/,% } expr Egész értékű argumentumok összeadása, kivonása, szorzása, osztása,

illetve maradékos osztása.

file Feladata, hogy egy állomány tartalmának típusát meghatározza.

Szintaktikus alakja file [-f ánév] [-cL] [-m máll] állomány

A felismert típusok lehetnek szöveg, végrehajtható, katalógus, archivált stb. A text típusú állományok esetén, megpróbálja a programnyelvet azonosítani. A parancs kapcsán megismerkedhetünk a /etc/magic állománnyal is. Ebben az állományban „mágikus” számok vannak felsorolva, és mellettük azok az állománytípusok, amelyek, jellegzetesen a jelzett karaktersorozattal kezdődő állományokat hoznak létre.

A file parancs legfontosabb opciói

-f ánév az opció használata esetén a vizsgálandó állományneveket az ánév állományból veszi.

-L ha az állomány szimbolikus link, akkor magát az állományt vizsgálja. -m máll használja az máll állományt az /etc/magic állomány helyett.

Page 265: unix kézkönyv

Függelék Mini manual

267

find Feladata, hogy az első argumentumában megadott katalógusból kiindulva, rekurzíven végigjárva a katalógusokat az opcióiban felsorolt tulajdonságú állományt megtalálja.

Szintaktikus alakja find útvonal kifejezés[ek]

Mint az alábbiakban látni fogjuk, find egyes opciói mellett számparamétereket kell adni, ezen számparaméterek megadásánál a következő konvenciók vonatkoznak: n pontosan n-nek felel meg, +n minden olyan számra igaz, amely nagyobb vagy egyenlő n-nél, míg -n minden olyan számra igaz, amely kisebb vagy egyenlő mint n. Vannak opciók, amelyek mellett paraméterek állnak, ezek akkor válnak igazzá, ha a vizsgált állomány adott tulajdonsága megfelel a paraméternek. A fontosabb opciók a következőek:

A find parancs és legfontosabb opciói

-name file Igaznak értékelődik ki, ha file ráillik az aktuális állománynévre. A szokásos metakarakterek használhatóak ( * ? [ - ] ).

[-perm] -onum Akkor igaz, ha az állomány engedélybitjei pontosan megegyeznek az oktális számként megadott onum-mal. Ha onum mínusz jellel kezdődik, akkor kiértékeléskor csak az onum-ban beállított engedélybiteket hasonlítja össze a find az állomány engedélybitjeivel.

-type l Akkor igaz, ha az állomány típusa bcdpf valamelyike; ezek sorra megfelelnek a blokkos állományoknak, a karakteres készülékeknek, a katalógusoknak, a névvel nevezett pipe-oknak, illetve a „normál” állomá-nyoknak.

-links n Igaz, ha az állománynak n darab linkje van. -user name Igaz, ha az állomány az user nevű felhasználóhoz tartozik. Ha user szám,

és nem szerepel bejelentkezési névként a /etc/passwd állományban, akkor felhasználói azonosítóként (uid) értelmezi.

-group gname Igaz, ha a felhasználó a gname csoporthoz tartozik. Egyébként lásd a -user opciónál mondottakat.

-size n[c] Igaz, ha az állomány n blokk hosszú (512 bájtos blokkok). Ha n utolsó karaktere c, akkor a méret karakterben értendő.

-atime n Igaz, ha az állományt valaki n napja használta. (A katalógusok elérési idejét maga a find parancs is állítja.)

-mtime n Igaz, ha az állományt n napja módosították. -ctime n Igaz, ha az állományt n napja változtatták.

Page 266: unix kézkönyv

UNIX felhasználói ismeretek

268

-exec cmd Igaz, ha a végrehajtott exec parancs visszatérési értéke zéró volt. A cmd parancsot egy backslash karakterrel, vagy más módon levédett, a parancstól szóközzel elválasztott ; karakterrel kell lezárni. A cmd-ben sze-replő { } karakterpár helyére az aktuális elérési név (pathname) helyettesítődik be.

-ok cmd Ugyanaz mint -exec, azzal az eltéréssel, hogy az aktuális állománynévvel kigenerált parancssor először kiíródik, és csak a felhasználó megerősítése (y karakter begépelése) után hajtódik végre.

-print Mindig igaz; hatására az aktuális elérési név kiíródik. -newer file Igaz, ha az aktuális állomány frissebben módosított, mint file. -depth Mindig igaz; hatására úgy járja be a find az állományrendszert , hogy

elsőként a katalógusban szereplő állományokat keresi meg, s csak utána magát a katalógusállományt. Ennek az az értelme, hogy az írási engedéllyel nem rendelkező könyvtárakból is ki lehessen másolni cpio- val az állományokat.

-mount Mindig igaz; hatására csak abban az állományrendszerben keres, ahol a kiindulópontban megadott katalógus fel van mountolva.

-local Igaz, ha az állomány fizikailag a helyi rendszerben helyezkedik el. \(expr\) Igaz, ha a zárójelezett kifejezés igaz. (A zárójeleket védeni kell a shell-től

egy megelőző \ karakterrel!)

A kifejezések kombinálhatóak is egymással, az alábbi, csökkenő precedencia szerinti felsorolással: 1. !negálja expr-t. 2. Az egymás mellé írt kifejezések konkatenálódnak, és and kapcsolat

szerint értékelődnek ki. 3. or kapcsolat szerint értékelődnek ki a -o operátorral felsorolt kifejezések.

grep Feladata, hogy egy adott minta előfordulását keresse a megadott állományokban, majd kinyomtassa mindazokat a sorokat, amelyek tartalmazzák a mintát. A grep az úgynevezett reguláris kifejezések korlátozott halmazát használja, ennek felhasználásával lehet megadni a keresett mintát. Több bemeneti állomány megadása esetén az állomány neve is kiíródik a találatok előtt.

Szintaktikus alakja grep [-ciln] [file]

Page 267: unix kézkönyv

Függelék Mini manual

269

A grep parancs és legfontosabb opciói

-c Csak a mintát tartalmazó sorok számát írja ki. -i A nagy- és kisbetűket azonosként kezeli. -l Csak azon állományok nevét írja ki (külön-külön sorokba), amelyekben a

minta szerepelt. -n A talált sorokat sorszámukkal együtt írja ki. -v Minden sort kiír, ami nem tartalmazza a mintát.

Page 268: unix kézkönyv

UNIX felhasználói ismeretek

270

login Feladata, a felhasználó beengedése a rendszerbe.

Szintaktikus alakja login [-d eszköz] [-h | -r] [név [környezet...]]

A login parancsot a rendszer adja ki, annak hatására, hogy egy CTRL-D karakter leütésével a terminál felszabadul. Amennyiben shell parancsként akarjuk kiadni azt csak az exec login paranccsal tudjuk megtenni. Amennyiben a login nevet csupa nagybetűvel írjuk, a rendszer azt a tanulságot fogja levonni, hogy a terminál csak nagybetűket tud. Hibás bejelentkezés esetén a Login incorrect üzenet jelentkezik a képernyőn. Öt egymás utáni hibás bejelentkezési kísérlet után, a hibás kísérleteket a rendszer elkönyveli, és több kísérletet nem enged. Hasonlóan, ha a bejelentkezést egy bizonyos időn belül nem sikerül befejezni, a rendszer a terminált lekapcsolja.

ls Feladata, hogy katalógusok tartalmát listázza ki, mégpedig úgy, hogy ha argumentumként katalógusnevet adunk meg, ls a katalógusban szereplő állományok nevét és információit listázza ki, az opcióknak megfelelően; ha az argumentum állománynév, ls az adott állományra vonatkozó információkat írja ki. Argumentum hiányában az aktuális katalógust listázza ki.

Szintaktikus alakja ls [ options ] [ file_or_dir_names ]

Page 269: unix kézkönyv

Függelék Mini manual

271

Az ls legfontosabb opciói a következők:

Az ls parancsnak nagyon nagyszámú opciója van, az alábbi lista csak egy töredékes válogatás a leggyakrabban használtakból. -R Rekurzíven kilistázza az összes alkatalógust. -a Minden katalógusbejegyzést kilistáz, a ponttal kezdődőeket is. -d Ha az argumentum katalógus, csak az ő bejegyzését listázza ki, a benne

szereplő állományokét nem. -C Több hasábban nyomtatja ki a katalógus-bejegyzéseket. -m Úgynevezett stream-formátum szerint, sorban, egymástól vesszővel

elválasztva írja ki az állományokat. -l Részletes információkat listáz ki, tulajdonos neve, hozzáférési jogok, link

count és módosítási idők stb. szerint. -r Megfordítja a listázás sorrendjét, ha alfabetikus volt, akkor fordított ábécé

sorrendben listáz, ha keletkezési idő szerint volt, akkor a legidősebbel fogja kezdeni.

-b A nem nyomtatható karaktereket az oktális \nnn jelölés szerint írja ki. -t Időrend szerint listáz. Más opciókkal beállítható, hogy az állomány utolsó

módosítása, vagy az i-node utolsó módosításának ideje (-c opció) szerint. -i Az állomány nevek mellé az inode számot is listázza.

mail Feladata, hogy a parancs révén üzeneteket küldhessünk más felhasználóknak a rendszerben, illetve más rendszerekbe is, ha gépünkön installálva van a megfelelő hálózati szoftver.

Page 270: unix kézkönyv

UNIX felhasználói ismeretek

272

Szintaktikus alakja

A levél írásakor az alábbi szerint kell kiadni a mail parancsot: mail [ -options ] persons

Levél olvasásakor az alábbiak szerint kell kiadni a mail parancsot: mail [ -options ] [ -f file ] [ -F persons ]

ahol persons a címzettek felsorolása, bejelentkezési nevük alapján.

A mail parancs legfontosabb opciói

Levél íráskor: -w a levél elindítása után rögtön kilép, nem kell a remote transfer program

befejeződésére várni. -t a levél elé beszúr egy To: kezdetű sort, jelezvén a címzetteket.

Levél olvasáskor: -e Az üzeneteket nem nyomtatja ki, hanem 0 értékkel tér vissza, ha a

felhasználónak van postája, 1 értékkel egyébként. Shell programokban hasznos megoldás!

-h Nem a legutolsó üzenetet írja ki, hanem az üzenetek fejlécét, utána ? prompttal vár újabb parancsra.

-p Kiírja az összes üzenetet és nem vár elhelyezési parancsot. -r A beérkezett üzeneteket időbeli sorrendben nyomtatja, nem a legkésőbb

érkezettet elsőnek. -F persons A bejövő üzeneteket átirányítja a persons felhasználóknak. -f file A bejövő üzenetet a file nevű állományba teszi.

Page 271: unix kézkönyv

Függelék Mini manual

273

Hacsak a parancssori opciók másképp nem rendelkeznek, a mail parancs kiírja a legutolsónak érkezett üzenetet, majd a ? prompttal újabb parancsbevitelre vár. A kiadható parancsok fontosabbjai: újsor, +, n A következő üzenetre lép. d, dp Törli az üzenetet és a következőre lép. dq Törli az üzenetet és kilép mail-ből. p Ismét kiírja az aktuális üzenetet. - Kiírja az előző üzenetet. a Kiírja a mail-ben töltött idő alatt érkezett újabb üzeneteket. r Válaszol az üzenet küldőjének, majd törli a kapott üzenetet. s file(s) Elmenti az üzenetet a megnevezett állomány(ok)ban. A default $MAIL. q, ctrl-d A ki nem olvasott üzeneteket elmenti és kilép mail-ből. x Minden üzenetet változtatás nélkül hagy és kilép mail-ből. ? Kiírja a rendelkezésre álló parancsokat (help).

mesg Feladata, hogy engedélyezze, vagy letiltsa egy másik felhasználó által write paranccsal küldött üzenet megjelenését a képernyőn.

Szintaktikus alakja mesg [-n] [-y]

A parancs opciói

-n a képernyőn a küldött szöveg nem jelenhet meg. -y a képernyőn a küldött szöveg megjelenhet. Ez az alapeset.

Page 272: unix kézkönyv

UNIX felhasználói ismeretek

274

mkdir Feladata új katalógus létrehozása.

Szintaktikus alakja mkdir [opció] név

A név katalógus, vagy útvonal/katalógus.

Az mkdir parancs opciói -mmode Az új katalógus hozzáférési joga mode értéke. -p Hozza létre a kívánt katalógus eléréséig a hiányzó katalógusokat is.

more Feladata, hogy egy állomány tartalmából egy-egy képernyőoldalnyi szöveget írjon ki a terminálra. A képernyő legalsó sorában egy --More-- üzenetet ír ki és további parancsra vár.

Szintaktikus alakja more [ opciok ] file file2...

A more parancs legfontosabb opciói -n A default helyett n soros képernyőt használ. -c Az új lapok nyomtatását mindig a képernyő tetején kezdi. -f Logikai sorokkal dolgozik, nem képernyősorokkal, így lehetővé teszi

képernyővezérlő karakterszekvenciák nyomtatását is. -s A többszörös üres sorokból csak egyet hagy meg. -r A nem nyomtatható karaktereket ^n formátumban jeleníti meg. (A more

alapértelmezés szerint ezeket a karaktereket figyelmen kívül hagyja.) -w Az input feldolgozása után nem lép ki, hanem újabb parancs bevitelére

vár. +n Az n-edik sorral kezdi a megjelenítést. +/minta/ A minta kifejezést tartalmazó sor előtt kettővel kezdi a megjelenítést. A more számára a következő parancsok adhatóak meg a lapváltásokkor (a lista nem teljes!): RETURN egy újabb sort listáz ki. SPACE hatására egy teljes képernyőnyit halad előre.

Page 273: unix kézkönyv

Függelék Mini manual

275

q,Q Kiléptet a more-ból. = Kiírja az aktuális sorszámot. h vagy ? a more parancsok help szövegét listázza ki. i/minta A reguláris kifejezésként megadott minta i-edik előfordulására áll. Ha

ilyet nem talált, a pozíció változatlan marad. in A legutoljára megadott reguláris kifejezés n-edik előfordulására áll. ' Arra a pontra áll, ahonnan a legutolsó keresés kezdődött, ha ilyen nem

volt, akkor az állomány elejére. . Megismétli a legutolsó parancsot. i:n A parancssorban argumentumként megadott i-edik állományra ugrik, illetve az

utolsóra, ha nem volt annyi megadva. i:p Az i-edik megelőző állományra tér vissza.

nohup Feladata, hogy megóvja a futó folyamatokat a felhasználó kilépésével kapcsolatos megszakítástól.

Szintaktikus alakja nohup parancs [parancsarg]

od Feladata, hogy állományokat, akár bináris kódúakat is, a kiválasztott formátumban „dumpoljon”.

Szintaktikus alakja od [-bcdosx] [file] [[+] offset [.] [b]]

Amennyiben az állomány neve elmarad, a kitöltendőt a standard outputról várja. Az offset az állomány elejéről elhagyandó bájtok száma, mégpedig az alábbi kódolásban; ha csak egy szám, akkor oktálisan értelmezhető, ha a számot követi egy pont, akkor a szám decimálisan értendő, ha a b betű is jelen van, akkor nem bájtokban, hanem 512 byte hosszú blokkokban kell az offset-et értelmezni. A + jel elválasztó karakter arra az esetre, ha az input a standard input.

Az od parancs legfontosabb opciói

Page 274: unix kézkönyv

UNIX felhasználói ismeretek

276

Az od az opciói szerint választható formátumok szerint nyomtatja ki a paraméterként megadott file tartalmát. Default opciója -o. Az opciók és jelentésük a következő: -b Bájtonként oktálisan írja ki az állományt. -c Bájtonként karakteres formátumban írja ki az állományt. A C nyelvben

definiált vezérlőkaraktereket az ott megszokott formátum szerint írja ki (null=\0, backspace=\b, lapdobás (form-feed)=\f, újsor=\n, reurn=\r, tabulátor=\t), az egyéb nem printelhető karakterek a \nnn formában jelen-nek meg, ahol nnn adott karakter oktális értéke.

-d Szavanként decimálisan írja ki az állomány tartalmát. -o Szavanként oktálisan írja ki az állomány tartalmát. -s Szavanként, előjeles decimális számként ír ki. -x Szavanként, hexadecimális formában ír ki.

Az offset paraméter azt adja meg, hogy honnan kezdődik az állomány listázása. Alapértelmezés szerint a megadott offset érték oktálisan és bájtokra értendő. Ha a . karakter szerepel utána, akkor decimális az érték, ha a b karakter szerepel, akkor pedig 512 bájtos blokkokban értendő. Ha nem szerepelt az offset beállítás előtt állománynév argumentum, akkor az offset elé egy + karaktert kell helyezni.

passwd Feladata, hogy a felhasználó a password-jét és a password attribútumait megváltoztathassa.

Szintaktikus alakja passwd [lgnév] passwd [-d|-l] [-f] [-n min] [-w figy] [-x max] lgnév passwd -s -a passwd -s lgnév

A használt rövidítések értelme: lgnév loginnév min a password két megváltoztatása között legalább min számú napnak kell

eltelni. max a password legfeljebb ennyi napig érvényes. figy a password lejárta előtt figy számú nappal a rendszer figyelmezteti a

password tulajdonosát a közelgő eseményre.

Egyéb argumentum hiányában a passwd parancs a parancs kibocsátójának password-jéről ad felvilágosítást. A password maga, legalább hat karakter hosszú, amiből legalább két karakter alfabetikus, és legalább egy szám vagy speciális karakter (pl.: @, & stb.). A password-nek különbözni kell a login névtől és az előző password-től, olyan mértékben, hogy azokból ciklikus eltologatással sem lehessen előállítani.

Page 275: unix kézkönyv

Függelék Mini manual

277

A passwd parancs legfontosabb opciói -a a password attribútumok lekérdezése minden felhasználóra. Csak a -s

opcióval együtt használható és természetesen csak szuperuser számára. -d törli a login névhez tartozó password-öt. -f minden belépéskor a felhasználónak cserélni kell a password-jét. -l zárolja, azaz megváltoztathatatlanná teszi a password-öt. -s megmutatja a password attribútumot.

pg Feladat, egy állományt a képernyőről olvasni hagyjon. A pg parancs, a more-hoz hasonlóan, számos plusz szolgáltatást is biztosít az állományok egyszerű megjelenítésén kívül, ezek közül elsősorban az érdemel figyelmet, hogy hátrafele is tud lapozni a megjelenített állományban.

Szintaktikus alakja pg [-egészszám] [ -p string ] [-cefns] [+sorszám ] [+/minta/] [file, file2...]

A pg parancs és legfontosabb opciói -egészszám Mint a more-nál. -p string Prompt szövegként a string-et használja. Ha a string tartalmazza a %d

szekvenciát, azt az aktuális lapszámra helyettesíti be. -c Mint a more-nál. -e Az egyes állományok végénél nem áll meg, hanem rögtön nyomtatja a

következőt, illetve kilép, ha vége az inputnak. -f Mint a more-nál.

Page 276: unix kézkönyv

UNIX felhasználói ismeretek

278

-n Nem vár RETURN billentyűre, a beolvasott parancskaraktereket rögtön végrehajtja.

+sorszám Mint a more-nál. +/minta/ Mint a more-nál.

A pg számára lapváltáskor a következő parancsok adhatók: n<SPACE>, vagy n<RETURN> n lappal előre, illetve hátralép.

pr Feladata, állományok nyomtatható lappá tördelése Alapbeállítás szerint a pr 66 soros lapformátum szerint nyomtat, ahol 2 üres sor után az egy soros fejléc, majd újra két üres sor, 55 szövegsor, végül 5 üres sor következik. Az alapértelmezés szerinti sorhossz 72 karakter. A lapokat nem form-feed karakterek, hanem megfelelő számú újsor karakterek választják el. Kimenetül a standard outputot feltételezi.

Szintaktikus alakja

Ha állományokat egymás után kívánunk nyomtatni: pr [ [oszlop] [-wszélesség] [-a]] [-eck] [-ick] [-drtfp] [+lap] [-nck] [-oeltolás] [-lhossz] [sszeparátor] [-h fejléc] [file...]

Ha egy oldalra, egymás mellé több állományt kívánunk nyomtatni: pr [ [-m] [-wszélesség] [-a]] [-eck] [-ick] [-drtfp] [+lap] [-nck] [-oeltolás] [-lhossz] [sszeparátor] [-h fejléc] file...

Page 277: unix kézkönyv

Függelék Mini manual

279

A pr parancs legfontosabb opciói

-oszlop oszlop számú hasábban nyomtat egy állományt. Az oszlop szám alapértelmezése 1.

-m Több állományt nyomtat egymás melletti hasábokban. A túl hosszú sorokat levágja.

-wszélesség a sorhosszat szélesség számú karakterre állítja. -a -eck A szövegben szereplő tabulátor karaktereket a megfelelő számú szóköz

karakterre cseréli. A tabulátorpozíciókat a k-adik pozíciókon tételezi fel (k+1, 2*k+1, ...). (A default érték 8.) Tabulátorkarakternek c-t tekinti, defaultja maga a tabulátor karakter.

-ick Az előző funkció fordítottja: az input szövegben szereplő szóközöket konvertálja át tabulátorokká, ha ez lehetséges.

-d Megduplázza a sorközt. -f Laphatárokon form-feed karaktert is nyomtat, nemcsak újsor karaktereket. -t Nem nyomtat sem fejlécet, sem lapkezdő és lapzáró üres sorokat. -p Ha az output a terminál, akkor oldalanként megáll a nyomtatás, csenget és

kocsivisszára vár, hogy folytassa. +lap A kezdő lapsorszám értéke lap. -nck k számjegyű sorszámnyomtatást biztosít (a default 5). Ha c adott, pr ezt

használja szeparátorkarakternek a sorszám és a szöveg között (defaultja a tabulátor).

-oeltolás Minden sort eltolás-nyi karakterrel jobbra tolva nyomtat. -lhossz A lapméretet hossz számú sorra állítja (default 66). A ténylegesen

nyomtatott sorok száma, mint már láttuk, ennél mindig tízzel kevesebb. -h fejléc A lapok tetején az állománynév helyett a fejléc stringet nyomtatja. -sszeparátor A szeparátor egy karakter, ami az egymás melletti oszlopokat elválasztja.

Page 278: unix kézkönyv

UNIX felhasználói ismeretek

280

ps Feladata, hogy a futó folyamatokról állapotinformációt adjon.

Szintaktikus alakja ps -[edafl] [ -n névlista] [-t terminállista] [-p folyamatIDlista] [-u userIDlista] [-g csoportIDlista]

A parancs folyamatokról számos tulajdonságot közöl, néhány ezek közül: UID a tulajdonos azonosítója PID, PPID a folyamat és szülőjének azonosítója TTY az indító terminál azonosítója STIME az indítás ideje (óra perc másodpercben) TIME a felgyülemlett futási idő S állapotinformáció, az alábbi kódolásban O a folyamat fut S a folyamat alszik R a folyamat a futásra várók közt áll I a procesz befejeződött Z elárvult folyamat, lefutott, de a szülője nem várta be. T a folyamatot futását egy signál felfüggesztette.

Az ps parancs legfontosabb opciói

-e minden futó folyamatról kér információt. Az opció hiányában csak a parancsot kiadó terminálról elindított folyamatokról kapunk jelentést.

-f teljes, minden információra kiterjedő listát kér. -a minden gyakran indított folyamatról ad információt, kivéve a process

csoport „vezetőket”, és a nem terminálról indíthatókat. -t term csak a term terminálhoz kapcsolódó folyamatokat sorolja fel

Page 279: unix kézkönyv

Függelék Mini manual

281

pwd Feladata, az aktuális, másképp munkakatalógus nevének kiírása.

rm, rmdir Feladata, állományok és katalógusok törlése.

Szintaktikus alakja rm [-r] [-f] [-i] file... dirname... rmdir [-p] [-s]

Az rm parancs legfontosabb opciói

-f A felhasználótól való visszakérdezés nélkül törli az állományokat, akkor is, ha írásvédettek. (Ha maga a katalógus írásvédett, s ezért nem törölhetőek az állományok, a felhasználó ebben az esetben sem kap hibaüzenetet.)

-r Az argumentlistában megadott katalógustól kezdve rekurzíven törli az alatta lévő állományokat és alkatalógusokat. (Tehát a nem üres katalógusokat törlés előtt, külön üzenet nélkül kiüríti.)

-i Az állományok törlése előtt megkérdezi a felhasználót.

Az rmdir parancsnál használt opciók: -p A katalógus törlése után, a szülő katalógust is törli, ha üres, rekurziven. A

standard outputra küld üzenetet, arról, hogy mi maradt a path-ból. -s A -p opció üzenetének elnyomása.

Page 280: unix kézkönyv

UNIX felhasználói ismeretek

282

set, unset Feladata, hogy segítségével lokális és globális környezeti változóknak értéke adhassunk, illetve az értékét törölhessük.

Szintaktikus alakja set [-l var[=érték]]... set [-e var[=érték]]... set [-ffile var[=érték]]... unset -l var... unset -fállomány var...

A állomány nevet szóköz nélkül, közvetlen az opció után kell írni. A -f opcióval beállított változókra a továbbiakban az állománynévvel együtt kell hivatkozni, például ${(állomány)Változó}.

A set és unset parancsok opciói -l az ezzel az opcióval beállított változót nem fogják örökölni a shell által

indított proceszek. -e az ezzel az opcióval beállított változókat minden shell által indított

procesz örökölni fogja. Figyelem, ezzel az opcióval nem lehet unset-telni!

-fáll az opció használata esetén, az áll állományba, ami már addig is létezett, vagy a parancs hozta létre, bekerülnek a változó=érték alakú sorok.

sh, rsh Feladata, hogy beolvassa, értelmezze és végrehajtsa a shell-parancsokat, egyben biztosítson egy környezetet azok végrehajtásához.

Szintaktikus alakja sh [-cefhiknrstuvx ] [ arg ] rsh [-cefhiknrstuvx ] [ arg ]

Az arg helyére a shell-parancsokat írhatjuk. Az rsh parancs egy olyan shell ahol nincs engedélyezve a cd parancs használata, nem értelmeződik a path vagy utasításnevekben a / jel, nem lehet a standard outputot átirányítani ( azaz nem használhatók a > és >> jelek ), valamint nem írható át a PATH környezeti változó értéke sem.

A sh parancs legfontosabb opciói -cstring a parancsot a string-ből olvassa

Page 281: unix kézkönyv

Függelék Mini manual

283

-i interaktív shell. (szintén interaktív a shell, ha az inputja és outputja egy terminálhoz kötött. Az interaktív shell-t nem lehet a kill 0 paranccsal agyoncsapni.

-r csökkentett lehetőségű, restricted (rsh) shell.

sleep

Feladata, a végrehajtás korlátolt idejű felfüggesztése.

Szintaktikus alakja sleep id•tartam

Az időtartam a várakozás ideje másodpercekben.

sort Feladata, hogy a megadott állományok sorait rendezze.

Szintaktikus alakja sort [ -cmu ] [ -ooutput ] [ -y[kmem]] [ -zrecsiz ] [ -dfiMnr ] [ -btx ] [ +-m[.n ][ bdfinr]] [ file ]

Az állománynév megadásánál - a standard inputot jelöli, de állománynév hiányában is a standard inputról olvas.

A sort parancs legfontosabb opciói

-c Ellenőrzi, hogy az állományok már rendezve vannak-e. -m A már külön-külön rendezett állományokat összefésüli (merge). -u A rendezésnél egyenlőnek talált sorokból csak egyet ír ki. -ooutput Standard output helyett output-ba írja a rendezett kimenetet. Azonos is

lehet valamelyik bemeneti állománnyal! -d Szótári sorrend: csak a betűk, számjegyek, valamint a blank karakterek

(szóköz és tabulátor) számítanak. -f A kisbetűk nagybetűnek számítanak. -i Az ASCII tartományon kívüli karakterek nem számítanak. -M Hónapok szerinti hasonlítás: a mező első három karaktere nagybetűvé

konvertálódik, és az érvénytelen < JAN < FEB < ... szabály szerint értékelődik ki.

Page 282: unix kézkönyv

UNIX felhasználói ismeretek

284

-n Aritmetikai értékek szerinti hasonlítás. A szám lehet előjeles tizedespontos szám, amelyet blank karakterek is megelőzhetnek.

-r Fordított sorrendű rendezés. -b A rendezési kulcsból elmaradnak a blank karakterek. +m[.n][bdfinr] A rendezés alapjául szolgáló hasonlítási kulcs kezdő pozícióját adja meg.

+m.n az m- edik mező n-edik karakterét jelenti. Több rendezési kulcs is meg lehet adva, de a második és a többiek csak akkor kerülnek ki-értékelésre, ha az első alapján a hasonlított sorok egyenlőnek bizonyultak. (Kulcs hiányában az egész sor alapján rendez. A rendezési opciók lehetnek globálisak, ha az egyes mezőkijelölések előtt lettek megadva, de külön-külön is megadhatóak az egyes kulcsokra.

-tx x lesz a mezőelválasztó karakter. -m[.n][bdfinr] A hasonlítási kulcs utolsó karakterének pozíciója.

Page 283: unix kézkönyv

Függelék Mini manual

285

split Feladata, hogy egy text típusú állományt szétdaraboljon.

Szintaktikus alakja split [-n][ állomány [ név ]]

Ha az állomány hiányzik, vagy egy - jel helyettesíti, a standard inputról veszi az adatokat. A részeket tartalmazó állományok neveit a név névaa-tól névzz-ig való kiterjesztéssel képezi.

Az split parancs opciója -n az egy darabban lévő sorok száma. Alapértelmezés 1000 sor.

stty Feladata, hogy a aktuálisan standard inputként használt terminál I/O tulajdonságait a parancs segítségével beállíthassuk.

Szintaktikus alakja stty [-a] [-g] ][opciók]

Ha a parancsot minden argumentum nélkül adjuk ki, a pillanatnyilag érvényes beállításokat kapjuk válaszul. Az opciók ebben az esetben nem a parancsra, hanem a terminálra vonatkozó opciókat jelentenek. Három csoportjuk van, az első a Control Mode-ra vonatkozó opciók (például paritás beállítás és ellenőrzés, karakterméret meghatározás, az adatküldés sebessége baudban stb.). A második csoportba az input szabályzására vonatkozó opciók vannak (például ignorálja vagy sem az beérkező break jelet, megkülönböztesse vagy sem a nagybetűket a kicsitől a CR karakternek megfeleltessen-e CR-NL-t stb. ). A harmadik opció csoport természetesen az outputra vonatkozik hasonló tartalmú opciókkal mint az input csoport. Az input opciók valamennyien i-betűvel, az outputok pedig o-betűvel kezdődnek. A vagylagosan értelmezhető opciók esetén egy opció bekapcsolása az opció nevének leírását, kikapcsolása a nevének leírását megelőzve egy - jellel jelenti.

A stty parancs opciói

-a visszaadja az összes létező opciót, a pillanatnyi beállításukkal.

Page 284: unix kézkönyv

UNIX felhasználói ismeretek

286

-g visszaadja a kurrens beállítást, olyan formátumban, ami egy újabb stty parancs bemenete lehet.

su Feladata, hogy kilépés és újbóli belépés nélkül „személyiséget” lehessen cserélni, azaz egy másik felhasználó, engedélyeivel lehessen dolgozni. Az új felhasználói arculat beléptetésével, a rendszer elindítja az /etc/passwd állományban az új felhasználóhoz tartozó login shell-t, illetve annak hiányában a /bin/sh-t. Természetesen mindehhez kell tudni a szuperuser jelszavát, kivéve ha a su parancs kibocsátója a root. Az EOF jel, (CTRL-D), exit vagy logout kiadásával térhetünk vissza a hívóhoz.

Szintaktikus alakja su [-] [ név [arg...]]

Ha semmilyen paramétert nem adunk, automatikusan a root lesz akivé válunk, feltéve ha tudjuk a root password-jét, egyébként pedig a név nevű felhasználókká lehetünk. A további arg-okat az induló shell-nek adja át a parancs. Ha a su parancs első opciója a - jel, az új felhasználói belépés úgy indul mintha valóban újból beléptünk volna, azaz elindítja a /etc/profile-t majd a user .profile-t is, ellenkező esetben ez elmarad.

Page 285: unix kézkönyv

Függelék Mini manual

287

tail Feladata, hogy az állományból, elejéről vagy végéről, egy darabot tudjunk levágni.

Szintaktikus alakja tail [ +-[number][lbc][f]] [ file ]

A tail parancs legfontosabb opciói +, - A nyomtatás az állomány elejétől (+) vagy végétől számítódjon-e

(alapértelmezés szerint a végétől). number sorokban értődik és alapértéke 10.

-lbc A sor, blokk, illetve karakter szerinti megadásra vonatkozik. -f Az állomány végigolvasása, illetve a kijelölt részek kiírása után megnézi,

hogy közben a bemenet nem bővült-e, s az időközben a bemeneti állományhoz fűződött sorokat is kiírja.

tar Feladata, valódi archivum létrehozása mágnesszalagra. A tar alkalmas arra, hogy katalógus struktúrákat másoljon. A létrehozott archívumban is módosíthatók a régi állományok, az újabb verziókkal pedig a régieket felül lehet írni. A többszörösen felfrissített archívumból pedig szelektíven beolvashatjuk a szükséges állományokat. A tar rokona az ar parancsnak.

Szintaktikus alakja

A tar szintaktikus alakja elég bonyolult, talán az alábbi alak közelíti meg a legjobban: tar -kulcs [nevek]

Page 286: unix kézkönyv

UNIX felhasználói ismeretek

288

Maga a kulcs az alábbi alakú karakterlánc: l[módosítók]

A nevek pedig sorrendben az alábbiak lehetnek: eszköz blockméret állománynevek (vagy katalógusnevek)

A kulcs funkciói (l betűvel jelölve) határozzák meg az elvégzendő feladatokat, és a megengedhető módosítókat. Ezek alapján az alábbi öt alakja lehet a tar utasításnak: c create: Az írás a szalag elejéről kezdődik, és nem az utolsó felírt egység

után. Ez az üzemmód magába foglalja a helyettesítő, -r, üzemmódot. /usr/bin/tar -c[vwfb[#s]] nevek... r replace: az állományokat az archívum végére kell tenni (nem keressük a

régebbi változataikat) /usr/bin/tar -r[vwb[#s]] nevek... t table: a szalagon előforduló állománynevekről egy ls -l parancséhoz

hasonló listát kell készíteni, valahány esetben a szalagon előfordulnak. /usr/bin/tar -t[vf[#s]] nevek u (update) az állományokat az archívumba kell tenni ha még nincsenek ott

vagy ha az archívumban lévő változatuk öregebb /usr/bin/tar -u[vwb[#s]] nevek...] x (exract) az állományokat az archívumból be kell olvasni, ha nincs

megadva állománynév akkor az egész archívumot be kell olvasni /usr/bin/tar -x[lmovwf[#s]] nevek...]

A módosítók sorrendje nem közömbös, a leírtaknak kell megfelelni.

Page 287: unix kézkönyv

Függelék Mini manual

289

A tar legfontosabb módosítói

b (blocking factor) A következő pozícióban egy szám áll, értéke 1-20 terjedhet, ami az archívum blockméretére utal. Alapérték 1. Csak valódi mágnesszalagos output esetén igaz. Ha ez a módosító igaz, akkor a nevek közt blockméret helyén kell ezt az értéket megadni.

f (file) Ha ez a módosító igaz akkor a nevek közt az eszköznek értéket kell adni, és ez lesz az archívum helye. Ez az érték lehet egy állománynév, de ha ezen a helyen egy - áll, az a standard outputot jelöli.

l (link) Ha ez a módosító igaz, akkor, és csak akkor a tar hibát jelez, ha nem tud minden linket feloldani.

o (ownership) Ha ez a módosító igaz a helyreállított állomány tulajdonos és csoport azonosítója a parancs futtatója lesz, az archívumban feljegyzett helyett.

w (what) Ha a módosító igaz, akkor minden akciót végrehajtás előtt jelezzen, és csak a felhasználó engedélyezése után indítson.

#s Ez a két karakter a mágnesszalag egység azonosítóját (#) és sebességét (s) jelöli. A # helyén egy szám áll, ami az egység sorszáma, az s betűhelyén az l (low), m (medium), vagy h (high) betűk egyike.

test Feladata, hogy a parancs paramétereként megadott kifejezést kiértékelje, s ha annak logikai értéke igaz, akkor nulla visszatérő értékkel terminálódikjék, egyébként nem-nulla visszatérő értékkel.

Szintaktikus alakja test expr

Az expr-ben szereplő operátorok, flag-ek és zárójelek mind szóközökkel elválasztva kell hogy szerepeljenek. Egyes esetekben, if parancs feltételeként, a test szócska elmaradhat egy szögletes zárójelpár helyettesítheti.

A test parancs legfontosabb opciói

-r file Igaz, ha file létezik és olvasható. -w file Igaz, ha file létezik és írható. -x file Igaz, ha file létezik és végrehajtható. -f file Igaz, ha file létezik, és reguláris állomány (nem periféria, pipe, vagy

egyéb). -d file Igaz, ha file létezik, és katalógusállomány. -c file Igaz, ha file létezik, és karakteres készülékállomány.

Page 288: unix kézkönyv

UNIX felhasználói ismeretek

290

-b file Igaz, ha file létezik, és blokkos készülékállomány. -s file Igaz, ha file létezik, és mérete nagyobb mint nulla. -z s1 Igaz, ha az s1 string hossza nulla. -n s1 Igaz, ha az s1 string hossza nagyobb, mint nulla. s1 = s2 Igaz, ha s1 és s2 stringek azonosak. s1 != s2 Igaz, ha s1 és s2 nem azonosak. s1 Igaz, ha s1 nem null-string (nulla hosszúságú, üres string). n1 -eq n2 Igaz, ha az n1 és n2 egészek algebrailag egyenlőek. Használhatóak

továbbá az egyéb egyenlőségi relációkat lefedő -ne, -gt, -ge, -lt és -le operátorok is.

A fenti elemi kifejezések kombinálhatóak is, az alábbi operátorokkal: ! Unáris negáló operátor. -a Bináris and operátor. -o Bináris or operátor. ( expr ) Zárójelezés a kiértékelési sorrend megváltoztatásához. (Ne felejtsük, hogy

a zárójeleket védeni kell a shell-től!)

tr Feladata, hogy a standard inputjáról a standard outputra másoljon, miközben a bemeneten érkező és a string1-ben megtalálható karaktereket a string2-beli azonos sorszámúra cseréli. Ha string2 rövidebb mint string1, akkor az utolsó karaktere többszöröződik.

Page 289: unix kézkönyv

Függelék Mini manual

291

Szintaktikus alakja tr [ -cds ] [ string1 ][ string2 ]

A tr parancs legfontosabb opciói

-c A string1-et komplementálja a teljes 8 bites ASCII kódkészlet szerint, azaz azok a karakterek vesznek részt a továbbiakban előírt operációkban, amelyek nem szerepelnek string1-ben.

-d Törli mindazon karaktereket az inputból, amelyek szerepelnek string1-ben.

-s A string2-ben többszörösen előforduló kimeneti karaktereket egyszer írja csak ki.

Az alábbi rövidítések használhatóak karaktertartományok, illetve ismétlődő karakterek jelölésére: [a-z] Az a és z közti karakterekből álló stringet jelöli. [a*n] Az a karakter n-szeres ismétlődését jelzi. n alapértelmezés szerint

decimális, ha első számjegye 0, akkor oktális. 0 vagy hiányzó n érték a maximálisnak felel meg; ez a funkció string2 kitöltésére alkalmas.

A backslash (\) karakterrel a megszokott módon védhetőek le a shell elől a speciális karakterek. A \nnn, ahol nnn egy egy, két vagy háromjegyű oktális szám, tetszőleges ASCII karakter megadására használható.

uniq Feladata, hogy megkeresse, és ha más opciót nem kérünk törölje az outputról az input állományban lévő ismétlődő sorokat.

Szintaktikus alakja

uniq [-[udc]] [-n][+n] [file1 [file2]]

Érdekessége, hogy a parancs inputja outputja egyaránt opcionális, akár a standard input vagy output, akár egy állomány.

A uniq parancs legfontosabb opciói

Page 290: unix kézkönyv

UNIX felhasználói ismeretek

292

-u Csak az egyedi sorok jelennek meg a kimeneten. -d Csak a többszörösen előforduló sorok egy-egy példánya jelenik meg a

kimeneten. -c Minden sort egyszer ír ki, de kiírja előttük azt is, hogy hányszor szerepelt

a szövegben. -n Az első n mezőt ignorálja az összehasonlításnál. Egy mező nem más mint

szóközzel vagy tabulátorjellel határolt nem szóköz és nem tabulátor karakterek sorozata.

+n Az első n karaktert ignorálja az adott mezőben.

wc Feladata, hogy a paraméterként megadott állományok, illetve azok hiányában a standard input sorainak, szavainak és karaktereinek számát adja meg, valamint egy összesítést is ad a fentiekre az összes állomány alapján. A wc szónak tekinti a szóközökkel, tabulátorokkal és/vagy újsor karakterekkel határolt karaktersorozatokat.

Szintaktikus alakja wc [-lwc] [file]

A wc opció nélkül alapértelmezésben mind a sor- mind a szó-, mind a karakterszámot kiírja. Explicit opciómegadás esetén csak a definiáltakat írja ki.

A wc parancs opciói

-l A sorok számát írja ki -w A szavak számát írja ki -c A karakterek számát írja ki

who, who am i, who am I Feladata, hogy a kérdező megtudja kik dolgoznak a rendszerben, illetve a második két alak segítségével, megtudhatja, hogy ő maga milyen login névvel, milyen azonosítójú terminálon lépett a rendszerbe.

Page 291: unix kézkönyv

Függelék Mini manual

293

Szintaktikus alakja who [-uTIHqpdbrtas] [állomány]

Az állomány kötött formátumú, és a bejelentkezések kronológiáját tartalmazza.

A válasz legáltalánosabb alakja az alábbi: (a szögletes zárjelbe tett leírókat csak egyes opciók váltják ki)

name [state] line time [idle] [comment] [exit]

Az egyes mezők értelme az alábbi: name login név state terminál állapot: más folyamat mint aki ott lépett a rendszerbe írhatja-e, ha

igen akkor ezen a helyen egy Ó áll, ellenkező esetben egy -. line a terminál vonal száma a /dev katalógus alapján. time a belépés ideje idle a terminál vonal utolsó működése óta eltelt idő órában. pid a felhasználó shell-jének folyamat azonosítója comment opciónként változik. az /etc/inittab állományból kiolvasott valamely

információ exit a -a opció írja, bizonyos folyamatok exit értékei.

Az who parancs legfontosabb opciói

-s alapértelmezés. -H írjon fejlécet az output elé. -p kilistázza az init program által elindított összes folyamatot, azokon a

neveken, ahogy azt az init az /etc/inittab-ban találja. -l Ez az opció csak azokat a terminálvonalakat sorolja fel, amelyeken a

rendszerbe be lehet jelentkezni, azaz fut rajtuk a getty, megkezdett bejelentkezés esetén pedig a login processz.

-u csak a bejelentkezett felhasználókat listázza ki, az opcionális mezőkből kitölti az idle, a pid és a comment mezőket. ( Az idle értéke old, ha boot-olás óta, vagy legalább 24 órája azt a vonalat nem használták.)

-r az init folyamat pillanatnyi futási szintjét írja ki. A folyamat befejezéskori státusát az idle mező alatt, a kilépési státusát az exit mező alatt írja ki.

-b az utolsó betöltés (boot-olás) idejét írja ki.

Page 292: unix kézkönyv

294

FÜGGELÉK

HIBAKERESÉS, TIPPEK ÉS TRÜKKÖK

Ebben a fejezetben gyűjtöttük össze, lehetőleg témák szerint rendezve, mindazokat a problémákat, amelyek a kezdő Unix felhasználó életét oly gyakran megkeserítik. Az elhangzottak egy részére a könyvben már szerepeltek utalások, mások a sehova be nem illeszthető, „mit tegyünk ha...” kategóriába tartoznak. Szerepelnek itt olyan problémák, amiket a tanfolyamaink hallgatóinál tapasztaltunk, mások viszonylag közismert és gyakran előforduló gondok, melyekre ugyan ott szerepelnek a kézikönyvekben a megoldások és bölcs intenciók, de ezekre a legritkább esetben bukkanhatunk rá céltudatos kereséssel... Mindegy, íme egy csokor az általunk legfontosabbaknak ítéltekből; csak buzdítani tudunk mindenkit e lista saját bővítésére, s ha ezt megosztják velünk a könyv következő kiadására, hisszük, hogy ez mindenki számára hasznos és gyümölcsöző lesz.

Bejelentkezés, terminálkezelés

Bejelentkezés után csupa nagybetűvel ír a rendszer, akár kis-, akár nagybetűt is használunk.

Problémánk gyökere valószínűleg abban rejlik, hogy bejelentkezési nevünk csak nagybetűket tartalmaz (vagy véletlenül a CAPSLOCK gombot lenyomtuk); a login program, amelyik a bejelentkezéseket ellenőrzi, ezek után azt tételezi fel, hogy olyan terminálon dolgozunk, amelyik csak a nagybetűket ismeri (ó, a hőskor...!) - s a továbbiakban ehhez is tartja magát, mindent nagybetűvel ír, a tényleges nagybetűket rendszerint egy eléjük helyezett backslash karakterrel különbözteti meg.

Az egyik megoldás, ha a CAPSLOCK „beragadása” okozta a problémát, a kijelentkezés, és újbóli belépés; ha a ellenben a bejelentkezési nevünk van rosszul megválasztva, cseréltessük le a rendszergazdával úgy, hogy legalább egy kisbetűt is tartalmazzon, ettől a login program „észreveszi magát”.

Ha valamilyen okból mégsem akarunk kilépni, az stty parancs megfelelő opcióival próbálkozhatunk: az stty iuclc -olcuc -xcase

Page 293: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

295

opciókombináció rendszerint segít a problémán.

Bejelentkezéskor (s ha sikeres volt, utána is) időnként értelmetlen karakterek szerepelnek a jók helyett.

Ha a rossz karakterek rendszeresen, minden második, harmadik karakterhelyen fordulnak elő, valószínűleg a paritáskezelés van rosszul beállítva. Az stty konfigurálását ilyenkor célszerű a rendszergazdára bízni, ha mégis magunknak kell boldogulni, akkor a parenb parodd cstopb cs7 cs8 paraméterekkel való szisztematikus kísérletezéssel állítsuk be a vonali jellemzőket.

Ha a hiba ékezetes magyar szöveg megjelenítésekor jelentkezik, valószínűleg az a gond, hogy terminálunk hét bites üzemmódra van állítva. Adjuk ki az stty cs8 -istrip parancsot a nyolcbites üzemmód beállítására.

Page 294: unix kézkönyv

UNIX felhasználói ismeretek

296

Fájlkezelés, parancsbegépelés

A fájlnév egy '-' karakterrel kezdődik. Hogyan lehet a fájlt átnevezni, vagy kitörölni?

A gond abban rejlik, hogy a '-' karaktert a programok opciókezdő karakternek tekintik, s ebbéli meggyőződésükről elég nehéz lebeszélni őket. Mindazonáltal több módon is megoldható a probléma. A legegyszerűbb, hogy a szóban forgó fájlnevet tetszőleges, akár relatív, akár abszolút elérési út megadással nevezzük meg, a lényeg az, hogy ne a mínusz jel kezdje a nevét. Ha például -xfile a fájl neve, a ./-xfile hivatkozás tökéletesen megoldja a problémát és „kezelhetővé” teszi a fájlt.

A másik megoldás, amit számos segédprogram elfogad, a '--' opció használata. Ez az opció ugyanis azt jelenti az adott programnak, hogy a következő paraméterek már nem tartalmaznak opciót. Így a fenti félresikerült nevű fájlt a legtöbb program jól kezeli a -- -xfile megadással. (Csak a zűrzavar fokozására említjük meg, egyes programok, például az rm egyes régebbi implementációi, az egyetlen mínusz jelet is ilyen értelemben kezelik, nem a standard bemenet vagy kimenet jeleként...)

Speciális karakterek kerültek egy fájlnévbe. Hogyan lehet a fájlt átnevezni, vagy kitörölni?

A legkézenfekvőbb megoldás, hogy keresünk a fájlnévben egy olyan jellemző részt, amelyik ezt és csakis ezt a fájlt jellemzi, majd ezt a mintát a fájlnév behelyettesítési mechanizmus speciális karaktereit felhasználva adjuk meg törlésre, valahogy így: rm *egyedi_minta* Ha pontosan nem tudjuk, a speciális karakter hol is került bele a fájlnévbe (és általában nem is tudjuk, hiszen ezek egyben rendszerint nem-nyomtatható karakterek is), akkor az od -c . paranccsal kérjünk egy listát a munkakatalógusról. E listában a katalógusfájl tartalma karakteres formában jelenik meg, a nem nyomtatható karaktereket oktális formában adja meg. A lista alapján egyértelműen eldönthető, hogyan is néz ki valójában a keresendő fájlnevünk, s hogyan tudjuk elkerülni, hogy az egyedi_minta megadásába bekerüljön a galibát okozó karakter is.

Ha valamilyen oknál fogva a mintaillesztést nem használhatjuk, a fájlkezelő parancsok -i (interaktív) opcióját használhatjuk, melynek hatására egyenként visszaigazolást kér, hogy végrehajtsa-e a szóbanforgó fájlok a kérdéses műveletet.

Ha a -i opcióval se boldogulunk, derítsük ki a renitens állomány inode számát (például az ls -il paranccsal), majd egy célzott find paranccsal, amelyik a kapott inode-hoz tartozó fájlt keresi, töröljük illetve módosítsuk:

Page 295: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

297

find . -inum inode_number -ok rm -f {} \; (A fenti műveletsor végrehajtásakor ne felejtkezzünk el arról, hogy az inode-ok csak egy önálló (becsatolható) állományrendszeren belül egyediek, tehát mivel az egész állományrendszerben több azonos inode is lehet, vigyázni kell arra, vajon tényleg a kívánt állományt töröljük-e – e célból is célszerűbb a –ok opció használata a -exec ellenében.)

Hogyan lehet egy kitörölt fájlt helyreállítani?

A lakonikus válasz az, hogy sehogy, s ez alól bizony kevés kivétel akad. Ha a problémán egy törlés után kezdünk el gondolkodni, bizony késő a bánat; a kitörölt fájlok felszabaduló blokkjai az állományrendszer szabad blokkjainak listájára fűződnek fel, ráadásul olyan szerencsétlen módon, hogy minden új helyfoglalási igénykor a legutoljára felkerült blokkokat osztja ki elsőként a rendszer. Egyetlen, hajszálnál is vékonyabb esély csak akkor van, ha akad a közelben szakértő rendszergazda aki azon nyomban lekapcsolja a gépet, majd többé-kevésbé manuális eszközökkel „visszavadássza” a törölt fájlt. A dolog közel sem triviális, s a sikere még ekkor is igen kétséges.

Egyetlen megoldás a megelőzés. Viszonylag könnyű és általános megoldást jelent az aliasok használata (sajnos ezt a mechanizmust nem minden shell ismeri). Ha viszont rendszerünkben használható, akkor az rm parancsot aliasként definiálhatjuk, az alias rm 'rm -i' vagy hasonló formában, s a továbbiakban az rm parancs meghívásakor az interaktív opció hatására rákérdez, hogy tényleg törölni akarunk-e. A megoldás (és minden más megoldás) hátránya a széles értelemben vett átvihetőség és szabványosság hiánya: ha egy másik Unixos gép elé ülünk le, nem biztos, hogy akár ez, akár más megoldás működik a gépen, s tévedésünkre rendszerint itt is csak az első törlés után döbbenünk rá...

'Command not found' vagy hasonló hibaüzenetet kapunk a shellscriptünk indításakor, noha végrehajthatóvá van téve és a munkakatalógusunkban van.

Néha, ha új környezetben dolgozunk, azt tapasztaljuk, hogy az elindított program nem indul el, pedig a munkakatalógusunkban van, és még végrehajtási jogunk is van rá. Ekkor jusson eszünkbe, hogy a Unix csak azokat a katalógusokat tudja elérni, amelyek a PATH változóban szerepelnek. Így ha az adott környezet PATH változójából hiányzik a mindenkori munkakata-lógus, a prog nevű programot a ./prog paranccsal tudjuk elindítani. (A kurrens katalógus PATH változóba illesztését biztonsági okokból nem javasoljuk.)

Nincs history szolgáltatás a csh esetén

Állítsuk be .cshrc fájlunkban az alábbiakat (a számérték természetesen egyéni ízlés dolga, a túl kis értékek az eseménypuffer értelmét kérdőjelezik meg, a nagy puffer pedig a shell indulását lassítja jelentősen): set history=20 # eseménypuffer mérete set savehist=20 # a kilépéskor meg•rzend• puffer mérete

Page 296: unix kézkönyv

UNIX felhasználói ismeretek

298

Változó értékadásánál a 'var: not found' hibaüzenetet kapjuk.

A probléma oka minden valószínűség szerint az, (a standard Bourne és a Korn shell használatát feltételezve), hogy az értékadás '=' karakterét szóközök veszik körül. A shell ugyanis csak akkor ismeri fel, hogy értékadásról van szó, ha az első szón belül szerepel az egyenlőségjel; ha szóköz van az egyenlőségjel körül, a shell a változónevet fogja a végrehajtandó parancs nevének tekinteni, az egyenlőségjelet az első, a változóértéket pedig a második paraméternek. E probléma a C shellnél nem merül fel, ott a szóközök megléte vagy nemléte érdektelen.

A shellscript, amit futtatunk, meg kellene hogy változtassa a kurrens katalógust (shellváltozót), de ez mégsem történik meg, a shellscript lefutása után változatlan marad.

A magyarázat a Unix többfeladatos működéséből következik. Amikor egy shellscriptet elindítunk, a shell egy újabb, úgynevezett subshellben indítja el a scriptet. A subshell örökli szülője környezetét, annak egy másolatával dolgozik tovább, de ebből az is következik, hogy a shellscript lefutása és a subshell befejeződése semmilyen hatást nem gyakorolhat az eredeti shellváltozókra, hiszen azoktól teljesen függetlenül kezelte őket a rendszer.

A problémának ha nem is megoldását, de megkerülését úgy érhetjük el, hogy a futtatandó scriptet nem subshellel futtatjuk, s így a script által módosított változók a kurrens környezetet módosítják. Bourne és Korn shell esetén a . shellscript paranccsal, míg C shell esetén a source shellscript paranccsal lehet a kurrens shellben futtatni.

Hogyan tudunk Bourne vagy Korn shellben a csh .logout fájljához hasonlóan, kilépéskor lefutó konfigurációs fájlt létrehozni?

Ha a fájl az egyszerűség kedvéért .logout névre hallgat, akkor a trap ". .logout" 0 parancs hatására, amikor a login shell a kilépést jelző 0 szignált észleli, végrehajtja a trap parancsban definiált parancsot, azaz a .logout fájlban megadott parancsokat.

Segédprogramok furcsaságai

A find parancs a -exec vagy -ok opció használatakor az 'incomplete statement' hibaüzenettel reagál.

Page 297: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

299

Gyakran kapjuk ezt a hibaüzenetet, ha a find parancsot a -exec vagy -ok opciókkal hívtuk meg. A kézikönyv ugyan megemlíti, hogy az ezen opciók után beírandó parancsokat a '\;' karakterekkel kell lezárni, de azt nem, hogy e karakterek és a velük lezárt parancs között legalább egy szóközt is el kell helyezni... Tehát például a find . -name thisfile -exec ls -l {}\; megadás helytelen, helyette az alábbit kell használni: find . -name thisfile -exec ls -l {} \; (A probléma nem minden find implementációban fordul elő.)

A test beépített parancs rövidített írásmódja

Gyakran lehet gondunk a test beépített shell parancs rövidített írásmódjával, amikor e shell szerkezetet a [] jelekkel rövidítjük. Noha implementációnként eltérhet a shell reagálása, saját keserű tapasztalataink alapján forrón javasoljuk mindenkinek, hogy a szögletes zárójelek mindkét oldalán helyezzen el szóközöket. Az alább következő példa az esetek többségében szintaktikai hibához vezet: if [-d $dfile]; ... helyesen (pontosabban biztonságosabban) így írjuk: if [ -d $dfile ] ;

Page 298: unix kézkönyv

UNIX felhasználói ismeretek

300

Hogy tagoljuk a shell vezérlési szerkezeteit?

Az alábbiak inkább shellscriptek írása közben zavarnak, de a megfelelő tanulság interaktiv parancsírásra is levonható. A C nyelvhez szokott felhasználók a shell vezérlő utasításait gyak-ran írják egysorba, elválasztó pontosvessző nélkül, valahogy például így: if date|grep SEPT then echo "Iskolaba megyunk" else echo "szunet van" fi

Biztosak lehetünk benne, hogy a fenti paranccsal jól megzavarjuk a shellt. Ugyanis, amit mi kulcsszónak gondolunk, azt a shell csak adott pozíciókban tekinti kulcsszónak, más helyen csak egy karaktersorozat, amit parancsargumentumként kezel. A kiemelt helyek, ahol a shell kulcsszókat keres: a soreleje, valamint a parancselválasztó pontosvessző utáni pozíció. Tehát a fenti parancs egy helyes alakja: if date | grep SEPT; then echo "Iskolaba megyunk" else echo "szunet van"; fi Az általános ökölszabály az, hogy a then, és a do „töltelékszavak” vonhatóak össze egy sorba az őket megelőző if, for vagy while szintaktikus elemekkel. Az összevonás feltétele, mint a fenti példán láttuk, a pontosvessző használata, mert ez parancsszeparátorként a kiváltott újsor karaktert helyettesíti. Tehát például az if expr; then while expr; do for var in wordlist; do rövidítések biztonsággal használhatóak.

Negált minták a grep parancsban

Milyen mintát kell adnunk a grep parancsnak ha egy állományból olyan sorokat szeretnénk kiválasztani,amelyek nem tartalmaznak egy adott karaktert, mondjuk a 9-es számot? Ez a kér-dés minden alkalommal megizzasztja a hall-

Page 299: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

301

gatókat. Ugyan is, ha olyan sorokat akarunk kiválasztani, amelyekben van 9-es szám, a dol-gunk egyszerű, a minta maga a szám. Ha ennek negáltját adjuk meg mintának, ([^9]), az meg fogja találni az összes olyan sort, amiben van legalább egyetlen nem 9-es karakter. A helyes megoldás szavakban így fogalmazódik meg; keressük azt a sort, amelyben az elsőtől az utolsó karakterig nincs 9-es. Jelekben: grep '^[^9]*$' file(s)

A vi (ed, ex) editor használata közben leállt a rendszer és elveszett az éppen szerkesztett fájl.

A vi egy külön könyvtárban biztonsági másolatokat tart fenn a szerkesztés menetéről. Rendszerhiba esetén a vi -r opcióval tudjuk megismételtetni a teljes előző szerkesztési menetet. A visszajátszás befejeztekor mentsük el a fájlt valamilyen néven, s máris továbbdolgozhatunk, nagy valószínűséggel csak az utolsó pár karakter hiányzik munkánkból.

Gyakoribb hibaüzenetek Az alábbiakban a leggyakrabban előforduló hibaüzenetekből „mazsolázunk”, a lehetséges gyakoribb kiváltó okokra rámutatva. Válogatásunk többé-kevésbé önkényes, hiszen alapvetően csak a minden rendszerben felbukkanó közös hibaüzenetekkel van értelme itt foglalkozni.

...arg count

Túlságosan sok, vagy túlságosan kevés argumentumot adtunk meg a program által várthoz képest. Az adott program manuál oldalain nézzük meg a pontos szintaxist, de gyakran a parancs által kiírt online 'Usage:' ismertető is kisegít.

Page 300: unix kézkönyv

UNIX felhasználói ismeretek

302

Arg list too long

A meghívott programnak átadott argumentumlista túl hosszú. Rendszerint nem az általunk begépelt argumentumok okoznak túlcsordulást, hanem a parancssorban szereplő fájlbehelyettesítések (egy nagy könyvtárban kiadott * fájlnév stb) (a `...` parancsbehelyettesítési mechanizmus is szolgálhat hosszú argumentumlistákkal).

Broken pipe

A pipeline-ba szervezett parancsok közül valamelyik időnek előtte elhalt, mialatt valaki még adatokat küldött neki.

File exists

A futtatott program már létező fájlt akar felülírni.

File not found

A program nem találja az általa keresett fájlt. A find paranccsal nézhetünk utána, ténylegesen hol is találhatóak a keresett fájlok.

File too large

A fájl kimerítette a rendelkezésre álló mérethatárt. (Az érték rendszerenként változhat.) Ilyen esetben forduljunk a rendszergazdához, mert számos esetben viszonylag könnyen lehet emelni a felhasználó számára rendelkezésre álló határokat.

Is a directory

A katalógusfájlt úgy próbáltuk meg írni/olvasni, mintha közönséges fájl volna.

No such file or directory

A megadott fájlnév paramétert (akár katalógust, akár közönséges fájlt) nem találja a shell. Ellenőrizzük a megadott fájl- illetve katalógusnevet.

Page 301: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

303

Not a directory

Katalógusnevet váró programnak nem katalógusnevet adtunk meg (például cd).

Not owner

Olyan fájlt próbáltunk meg elérni vagy módosítani, amelyikre nincs meg a megfelelő jogunk. Ugyanezt a jelzést kapjuk, ha nem általunk indított folyamatot próbálunk meg törölni a kill paranccsal.

Out of memory

Túlságosan sok folyamat fut és elfogyasztották a rendelkezésre álló memóriát. A más által indított folyamatokkal persze nem sokat kezdhetünk, de a ps paranccsal megkereshetjük esetleges saját, már nem szükséges processzeinket, s törölhetjük őket. (Gyakran előfordul, hogy egy folyamat számos más folyamatot indít el, s ezek időnként „bentragadnak” a rendszerben, noha már nem futnak. (Kiváltképpen az X Window alapú, grafikus ablakfelülettel ellátott rendszereken szaporodnak minden mértéken felül.)

Permission denied

Megfelelő jogok hiányában próbáltuk meg olvasni, írni vagy végrehajtani a fájlt.

Too many arguments Too few arguments

Túlságosan sok, vagy túlságosan kevés argumentumot adtunk meg a hívott programnak. (Például egynél több argumentum a cd parancsnál, vagy kettőnél kevesebb az mv-nél stb.)

Usage: ...

Számos program, ha rossz argumentumokkal hívták meg, kiír egy rövid emlékeztetőt, hogy hogyan is kell helyesen használni. Ha e tájékoztató által nyújtott információ nem elég, akár az online, akár a nyomtatott kézikönyv ad részletesebb információt.

... Unknown option

Page 302: unix kézkönyv

UNIX felhasználói ismeretek

304

A programnak átadott opció ismeretlen a program számára.

Rendszerállapot változásai

Disk quota exceeded

Betelt a számunkra kijelölt kvóta, miközben új fájlt akartunk létrehozni, illetve már meglévőt módosítani. A kvótaértéket csak privilégizált felhasználó módosíthatja.

Page 303: unix kézkönyv

Függelék Hibakeresés, tippek és trükkök

305

Read only file system

A fájlrendszer, amin írni próbáltunk, írásvédett. Önmagában álló, hálózatos kapcsolatok nélküli rendszeren ez rendszerint akkor fordul elő, ha a CD-ROM-ot, vagy az írásvédett floppyt az írásvédettség deklarálása nélkül próbáltuk a mount paranccsal becsatolni. Hálózaton lévő Unix rendszereknél gyakori, hogy a hálózaton keresztül, az NFS protokollal hozzáférhető fájlrendszerek is csak olvashatónak vannak deklarálva.

... write failed, file system is full File system full

A megnevezett fájlrendszeren nincs több szabad hely. Noha ez általában több felhasználó szerencsés együttműködésének „gyümölcse”, az esetlegesen általunk indított nagyméretű nyomtatási feladatok, „szemét” (junk) fájlok, átmeneti anyagok, core fájlok stb. törlése segíthet a helyzeten. Ha nem, meg kell várni, amíg a rendszergazda helyet nem csinál, illetve a nyomtatások befejeztével a spooler által igényelt hely felszabadul a lemezen.

Segmentation fault Core dumped Bus error Core dumped

Váratlan belső hiba, rendszerint a program számára kiosztott memóriahatárok megsértésekor jelentkezik. Akár saját programjaink hibás működése, akár valamelyik rendszerprogram hibája eredményezheti. A 'core dumped' üzenet jelzi, hogy az esetleges nyomkövetés céljaira egy core nevű állomány keletkezett, amelyik a rendszer memóriaképét és egyéb nyomkövetési információkat tartalmazza. (Ha nem használjuk fel hibakeresésre ezeket a fájlokat, célszerű rendszeresen irtani őket, mert kivált a mai terjedelmesebb Unixokban igen nagy helyet foglalnak el1.

1 Szerzõ némi dicsekvéssel állítja, neki sikerült már hét és fél megabájtos core állományt is generálnia...

Page 304: unix kézkönyv

306

14. FEJEZET

FELADATGYÛJTEMÉNY

A feladatok megoldásánál a számozás sorrendjét ajánlatos követni, mert a feladatok egymásra épülnek, felhasználják az elõzõ feladatok eredményeit. Megoldás közben a manuál használata nem tilos, sõt javallott. Egyes feladatok olyan parancsok felhasználását kívánják meg, amelyeket a könyv anyaga nem tartalmaz. Ezeket a parancsokat megjegyzésként a feladatokhoz írtuk, hogy az olvasó a manuálból könnyen kikereshesse. A feladatok megoldása közben ne felejtsük el, hogy a puding próbája...

Végül elnézést kérünk azért a pongyolaságért, hogy a fájlok neveire, ahol az úgyis egyértelmû, nem teljes elérési névvel hivatkozunk.

UNIX alapfogalmak [1] Deklaráljunk a saját alapkatalógusunkban alkatalógusokat az alábbi nevekkel: bin,

tmp, box, work, work/store.

[2] Változtassuk a fenti katalógusok engedélyeit az alábbiakra: bin: mindenki számára kereshetõ-olvasható, és csak a tulajdonos

számára írható. box: mindenki számára csak írható, a tulajdonos számára olvas-

ható is, a csoporttársak keresni is tudnak benne.

[3] Bõvítsük a PATH változót úgy, hogy a saját tmp katalógusunkat elõbb érje el, mint bármelyik másik katalógust, ami a PATH változóban szerepel.

[4] Bõvítsük a PATH változót úgy, hogy a saját work katalógusunkat késõbb érje el, mint bármi más katalógust, ami a PATH változóban szerepel.

[5] Hova vezet a munkakatalógusban kiadott cd ../.. parancs?

[6] Készítsünk (a cat parancs segítségével) egy forras nevû fájlt az alábbi tartalommal: baba szep baba abba alma

Page 305: unix kézkönyv

Függelék Feladatgyûjtemény

307

eper szilva dinnye 6darab

[7] Készítsük el a forras fájl „nyomtatási tükörképét” (a pr parancs által létrehozott változatát) a temp nevû fájlban. Hogyan tudnánk ezt mindjárt kinyomtatni (pr és lp parancs)?

[8] Készítsünk másolatokat a forras fájlról a work, és tmp katalógusokban. Legyen köztük olyan, amelyben kétszer is benne van az eredeti fájl. (Az új fájlokra a továbbiakban forr1 és forr2 néven fogunk hivatkozni.)

[9] Tegyük a tmp katalógusban lévõ fájlunkat írásvédetté.

[10] Az alapkatalógusban lévõ forras fájlhoz láncoljunk hozzá egy forras és egy forras9 nevû fájlt a work katalógusban. Nézzük meg az eredeti fájl láncszámát.

[11] Töröljük ki a tmp-ben lévõ forr2 fájlt.

[12] Nézzük meg, work mely fájljainak van egynél nagyobb linkszáma.

[13] Nézzük meg, hogy mely fájlnevek tartoznak azonos fájlhoz a work katalóguson belül.

[14] Készítsünk egy egynél nagyobb linkszámú és egy pontosan 1 linkszámú fájlból összefûzve egy új fájlt a munkakatalógusunkban.

[15] Nézzük meg, hogy milyen rejtett fájlok vannak az alapkatalógusban.

[16] Számoljuk meg, hogy hány elem van a /dev katalógusban.

[17] Listázzuk ki a /dev katalógusból a négybetûs, tty-al kezdõdõ fájlok neveit.

[18] Listázzuk ki a /dev katalógusból a 't'-vel kezdõdõ, 3-8-as számok egyikére végzõdõ fájlok neveit.

[19] Számoljuk meg, hogy hány olyan név van a /dev katalógusban, amelyben az 0..9 számjegyek egyike szerepel.

[20] Listázzuk ki a /dev katalógusból a csak egy számjegyet tartalmazó fájlok neveit.

[21] Nézzük meg, hogy hány végrehajtható fájl van a /bin katalógusban.

[22] Térjünk vissza a work katalógusba. (Figyelem, a legkevesebb karakter leütésével!)

[23] Olvassuk ki a munkakatalógus tartalmát, de ne a „szabályos” ls paranccsal (lásd: od)

[24] Mi a különbség az alábbi parancsok végrehajtásában?

Page 306: unix kézkönyv

UNIX felhasználói ismeretek

308

ls ls -r ls -F ls * ls -R ls * [25] Írassunk ki az echo paranccsal a képernyõre három csillagot. Hányféleképp tudjuk ezt

megtenni?

[26] Nézzük meg a shell-változók értékeit, majd az exportált (környezeti) shell-változókét.

[27] Írassuk ki a saját nevünkkel azonos nevû shell-változónak a tartalmát.

[28] Készítsünk magunknak egy „útvonal”shell-változót ami a gyakran látogatott work, illetve tmp katalógusba vezet.

[29] Menjünk a /etc katalógusba, és ott olvassuk el (listázzuk ki) a work/forras9 nevû fájlunkat, az elõbb definiált útvonalváltozó segítségével:

A vi kezelése A feladatoknak több megoldása is lehet. Törekedjünk minél rövidebb parancs sor segítségével megoldani a feladatokat.

A gyakorlathoz szükséges egy legalább 100 soros szöveg fájl. Kiválóan alkalmas e célra valamelyik parancs on-line manuáljának listája, amit egy fájlba irányítottunk át, például:

man sh >sh.man A parancsokat betûhelyesen próbáltuk megadni, ami persze nehézségekbe ütközik a nem nyomtatható karakterek esetén. A parancsbetûk közti szóköz csak a tagolás kedvéért szerepel, begépelni õket nem kell! (Ahol ténylegesen a szóközt is be kell gépelni, ott ezt más módon, például az egész karaktersorozat idézõjelek közé zárásával úgyis jelezzük.) A vezérlõkaraktereket vagy a CTRL-C, vagy a <...> karakterek közti névmegadással jelezzük.

[30] Hozzunk létre egy új fájlt a vi editorral.

[31] Indítsuk el a vi editort "read only" üzemmódban.

[32] Lépjünk ki a vi-ból. Hogyan lehet mentéssel, illetve mentés nélkül kilépni?

[33] Pozicionáljuk a kurzort egy karakternyit le, föl, jobbra, balra. /Ügyeljünk az aktuális üzemmódra, kurzormozgató nyilak nélkül dolgozzunk!/

Page 307: unix kézkönyv

Függelék Feladatgyûjtemény

309

[34] Pozicionáljuk a kurzort 4 karakternyit le, föl, jobbra, balra. /ügyeljünk az aktuális üzemmódra, kurzormozgató nyilak nélkül dolgozzunk!/

[35] Pozicionáljuk a kurzort jobbra, balra egy szóval, majd az adott soron belül 2-3 szóval jobbra, balra. Mi történik akkor, ha az adott sorban (jobbra, balra) kevesebb szó található a megadottnál?

[36] Pozicionáljuk a kurzort a képernyõ tetejére, közepére, aljára.

[37] Lapozzunk két és fél oldalt elõre, majd másfél oldalt vissza.

[38] Mozgassuk a kurzort a szöveg utolsó sorára.

[39] Mozgassuk a kurzort a szöveg elsõ sorára.

[40] Mozgassuk a kurzort a szöveg 20. sorára.

[41] Mozgassuk a kurzort tiz sorral elõre, majd vissza.

[42] Mozgassuk a kurzort az utolsó elõtti 6. sorra.

[43] Mozgassuk a kurzort az aktuális sor elsõ karakterére, majd az utolsóra.

[44] Mozgassuk a kurzort az aktuális sor tizedik, majd az utolsó elõtti tizedik karakterére.

[45] Mozgassuk a kurzort az aktuális sor második majd utolsó szavára

[46] Indítsuk el úgy a vi editort, hogy indítás után az editált fájl 10. sorára álljon.

[47] Írjunk be az utolsó elõtti 5 sor második szava elé egy tetszõleges szöveget /pl.: cica mica/.

[48] Írjunk be az 5. sor utolsó szava mögé egy tetszõleges szöveget /pl.: EZ ITT A SOR

VEGE/. [49] Írjunk be az utolsó sor elsõ szava elé egy tetszõleges szöveget /pl.: UTOLSO SOR/. [50] Írjunk be az elsõ sor elé egy tetszõleges szöveget /pl.: EZ ITT A HEADER HELYE/. [51] Írjunk be az utolsó sor mögé egy tetszõleges szöveget /pl.: EZ ITT A FOOTER

HELYE/. [52] Álljunk egy szó közepére, s módosítsuk a az adott szót /például mozdonyfuto ->

mozdonyvezeto). [53] Módosítsunk egyszerre három, egy sorban levõ és egymás melletti szót a

szövegünkben.

Page 308: unix kézkönyv

UNIX felhasználói ismeretek

310

[54] Helyettesítsük az adott sor utolsó négy szavát. [55] Módosítsuk az egész sort. [56] Töröljük ki a kurzortól jobbra esõ karaktert, majd helyére szúrjunk be egy szöveget. [57] Helyettesítsük a kurzor alatti karaktert az 'A' betûvel. [58] Helyettesítsük kurzor utáni karaktereket. [59] Egyesítsük az 5. és 6. sort. [60] Kis betûvel írtuk egy fejezet címét (bevezeto); mozgassuk a kurzort a szó elejére és

konvertáljuk a kisbetûket nagybetûre, majd írjuk vissza kisbetûre. [61] Álljunk egy tetszõleges sorra. Töröljük ki a kurzortól jobbra esõ szót. [62] Töröljük ki az adott sor utolsó négy szavát. [63] Töröljük ki az adott sor elsõ négy karakterét. [64] Szüntessük meg, azaz állítsuk vissza az utolsó törlés elõtti állapotot. [65] Állítsuk vissza az adott sor eredeti tartalmát /a soron végzett összes módosítás

megszüntetése/. [66] Töröljük ki az elsõ 5 sort. [67] Töröljük ki az utolsó 5 sort. [68] Töröljük a kurzor aktuális sora körül elhelyezkedõ sorokat /+- 2 sort/. [69] Töröljük ki az elsõ sort és másoljuk át az utolsó sorba. [70] Duplázzuk meg a 9. sort. [71] Cseréljük fel a szöveg elsõ és utolsó öt sorát. [72] Keressük meg a szövegünkben lefelé a "the" /vagy tetszõleges más/ szót. [73] Keressük meg a következõ elõfordulását. [74] Keressük meg a szövegünkben felfelé a "the" /vagy tetszõleges más/ szót.

Page 309: unix kézkönyv

Függelék Feladatgyûjtemény

311

[75] Keressük meg az editált szövegben az összes olyan sort, amely a "UNIX" szóval kezdõdik.

[76] Keressük meg az editált szövegben azokat a sorokat, melyek a "able" karakter sorozatra

végzõdnek. [77] Keressük meg az editált szövegben azokat a sorokat, melyekben olyan karakter láncok

találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, valamint ezenkívül "r", "m", "p", "g" betûket tartalmaznak.

[78] Keressük az editált szövegben a kurzor pozíciójától visszafelé azokat a sorokat, melyekben olyan karakter láncok találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, ezenkívül csak "m"-tõl "s"-ig terjedõ karaktereket tartalmaznak.

[79] Keressük az editált szövegben a kurzor pozíciójától visszafelé azokat a sorokat, melyekben olyan karakter láncok találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, valamint a két "a" között tetszõleges számú karaktert tartalmaz.

[80] Cseréljük le az adott sorban az elsõ "the" szót az "eht"-re.

[81] Cseréljük le az adott sorban az összes "the" szót az "eht"-re.

[82] Cseréljük le az adott sorban az összes "the" szót az "eht"-re, de minden egyes csere elõtt kérdezzen rá a cserére.

[83] Cseréljük le az egész szövegben a sorok elsõ "the" szavát az "eht"-re.

[84] Cseréljük le az egész szövegben az összes "the" szót az "eht"-re, rákérdezéssel. [85] Cseréljük le a kurzor sorában az elsõ olyan karakter láncot, mely "a" betûvel kezdõdik

és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

[86] Cseréljük le a kurzor soráig a szövegben az adott sor elsõ olyan karakter láncát, mely "a" betûvel kezdõdik és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

:1,.s/a.*a/ talalt / <RETURN>

[87] Cseréljük le az egész szövegben az adott sor elsõ olyan karakter láncát, mely "a" betûvel kezdõdik és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

[88] Cseréljük le az egész szövegben azokat a sorokat melyekben csak az "EXAMPLES" szöveg található "PELDAK"-ra.

[89] Keressük meg a kurzor sorától +- 5 sorban található, a sor elején "A"-val kezdõdõ és

szintén "A"-val záruló tetszõleges hosszúságú karakterláncokat, majd írjuk be elé a "Minta: " szöveget.

Page 310: unix kézkönyv

UNIX felhasználói ismeretek

312

[90] Keressük meg a teljes szövegben azokat a mintákat, melyek "A"-val kezdõdnek, és utána tetszõleges számú 'l' és 'z' közti karaktereket tartalmaznak. Az illeszkedõ szöveget tegyük "[]" közé. Minden egyes csere elõtt kérdezzünk rá a cserére.

[91] A kurzor sora mögé olvassuk be egy másik szövegfájl tartalmát. [92] A 10. sor mögé olvassuk be egy másik szövegfájl tartalmát. [93] A kurzor sora mögé olvassuk be az aktuális katalógus tartalmát. [94] Az editált szövegünket írassuk ki egy "filename" nevû fájlba. [95] Az editált szövegünk elsõ 30 sorát írassuk ki egy "filename" nevû fájlba. [96] Térjünk át egy másik ("filename" nevû) fájl editálására. [97] Indítsuk el a vi editort három editálandó állománnyal. Próbáljuk ki hogyan lehet áttérni

a következõ fájlok editálására. Hogyan lehet átlépni az alternatív fájl editálására? [98] Lépjünk át "ex" módba, majd vissza. [99] Írassuk ki a vi editorral a konfigurációs paramétereit. [100] Állítsuk be az aktuális mód kiíratást. Figyeljük meg ennek hatását. [101] Állítsunk be sorszám kiírást. Figyeljük meg hatását. [102] Állítsuk be az automatikus mentés funkciót. [103] Változtassuk meg az újsor nyitás margóméretét (wrapmargin) 10-re. Nézzük meg

hatását. [104] Állítsuk át a tabulátor méretét 8-ról 4-re. Vizsgáljuk meg az átállítás hatását. [105] Írassuk ki a vi belsõ paramétereit. [106] Készítsünk a vi számára lokális inicializáló fájlt, melyben beállítjuk a mód kiíratást,

automatikus mentést és megváltoztatjuk a tabulátor méretét.

A shell és a segédprogramok [107] Írjuk ki a képernyõre: Most a ...ban vagyok

Page 311: unix kézkönyv

Függelék Feladatgyûjtemény

313

ahol a pontok helyére a HOME változó tartalma kerüljön. [108] Hogyan lehet a képernyõre írni, hogy A $HOME erteke ...

[109] Írjuk ki a képernyõre, hogy date Fog valami érdekes ettõl történni? Hogyan érhetõ el, hogy az echo a napi dátumot írja

vissza? [110] Nézzük meg, hogy a forras nevû fájlban van-e "e" betûvel kezdõdõ sor? [111] Nézzük meg, hogy a forras nevû fájl mely soraiban van "e" betû. [112] Nézzük meg, hogy a forras nevû fájlban hány mássalhangzóval kezdõdõ sor van?

[113] Keressünk egymás utáni azonos betûket a forras fájlban. Használjuk a minta kijelölését, és számlált elõfordulását.

[114] Nézzük meg, hogy a forras nevû fájlban van-e 6-os számjegy.

[115] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor, amiben nincs 6-es számjegy.

[116] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor ahol a sor utolsó két karaktere azonos az elsõ kettõvel?

[117] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor amiben van polindrom. (4 betûs)

[118] Írjuk bele a hónapok neveit, összevissza sorrendben egy honap nevû fájlba. Használjuk a beágyazott input ("here document") mechanizmusát.

[119] Rendezzük a honap fájl sorait (sort parancs) — ábécé szerinti sorrendbe; — csináljunk minden betûjébõl nagybetût (tr parancs); — rendezzük a csupa nagybetûs hónapok fájlt természetes sorrendbe. [120] Írjuk ki a képernyõre a /etc/passwd fájl tartalmát a bejelentkezési nevek ábécé

sorrendje szerint. [121] Írassuk ki, hogy egy fél perc múlva milyen folyamatok futnak a gépen, közben pedig

végezzünk tetszõleges más tevékenységet (például készítsünk egy fájlt cat utasítással). (sleep és háttérben futtatás)

Page 312: unix kézkönyv

UNIX felhasználói ismeretek

314

[122] Írjunk egy lscim nevû függvényt, ami az ls parancs kiadása elõtt kiírja a kilistázott katalógus nevét.

Shell programozás Az alábbi feladatok arra is példát szeretnének mutatni, hogy hogyan egészíthetjük ki az utasításkészletünket általunk gyakran használt, saját készítésû segédprogramokkal. Érdemes erre figyelnünk, mert sok munkát, így idõt is takaríthatunk meg velük. [123] Írassuk ki, és számoljuk meg, hogy egy script indítása után hány shell fut. [124] Nézzük meg, hogy egy bizonyos felhasználó dolgozik-e, és fut-e épp folyamata. [125] Csináljunk egy programot, ami semmi mást nem tesz, mint visszaadja a kapott

argumentumokat, amiket azonban különbözõ módokon fejt ki. Próbálgassuk különbözõ argumentumokkal meghívni. (Például 1 2 3, "1 2" 3, 1 '2 3' stb.).

[126] Írjunk egy modv nevû script-et ami a tulajdonos és a vele egy csoportban lévõ

számára végrehajthatóvá tesz egy programot, majd átteszi a /$HOME/bin katalógusba. Hajtassuk végre saját magán.

[127] Írjunk „ébresztõórát” ami egész órakor üzenetet küld a képernyõre. Tegyük végrehajthatóvá, másoljuk a /$HOME/bin katalógusba és indítsuk el a háttérben. (date parancs)

[128] Írjunk egy fejlec nevû programot, ami C nyelvû vagy shell parancsokból álló programok elsõ sorába az aktuális dátumot írja kommentként. Tegyük végrehajthatóvá és másoljuk be a /$HOME/bin katalógusba.

[129] Hozzunk létre egy sorsz nevû programot, ami az f1 fájl sorainak számozásával állítja elõ az f2 állományt. Tegyük végrehajthatóvá és másoljuk be a $HOME/bin katalógusba.

[130] Van-e ebben az évben hétfõvel kezdõdõ hónap? Ha találunk ilyet, írjuk ki betûkkel a hónap nevét. (cal parancs)

[131] Írjunk olyan script-et, ami ugyanazt a levelet ($2) elküldi a fájlban megnevezett ($1) felhasználóknak.

[132] Hogyan állapíthatjuk meg, hogy milyen shell alatt dolgozunk?

Mentés, visszaállítás

Page 313: unix kézkönyv

Függelék Feladatgyûjtemény

315

— Sajnos ez az a rész, ahol elkerülhetetlenül beleütközünk az eltérõ fájl- és periférianevek problémájába. A saját gépünkön használt neveket kérdezzük meg a rendszergazdától és helyettesítsük be a példáinkban szereplõk helyére. Az alább következõ gyakorlatokban a hajlékonylemezes egységet (floppy) és a streamer kazettát használjuk, ezeket a /dev/rfd0, illetve a /dev/rst0 néven szerepeltetjük. — A feladatoknak több megoldása is lehet. — Törekedjünk minél rövidebb parancs sor segítségével megoldani a feladatokat. — A fájl név megadásakor mindig relatív elérési neveket használjunk. — A gyakorlathoz szükséges 2-3 fájl (pl.: pro1, pro2, pro3).

Példák a dd használatára [133] Írjuk ki a floppy-ra a pro1 fájlt a dd segítségével. Állítsuk be az input-output blokk

méretet 9 kilobyte-ra.

[134] Olvassuk vissza a floppy-ra kiírt pro1 fájlt a dd segítségével pro1.dd néven. Hasonlítsuk össze az eredetivel.

[135] Írjuk ki a floppy-ra a pro2 fájlt a dd segítségével. Állítsuk be az input-output blokk

méretet 4 kilobyte-ra, valamint végeztessünk kisbetû konverziót.

[136] Olvassuk vissza a floppy-ra kiírt pro2 fájlt a dd segítségével pro2.dd néven. Hasonlítsuk össze az eredetivel.

[137] Írjuk ki az rst0-ra (magnetic tape) a pro3 fájlt a dd segítségével. Állítsuk be az input-

output blokk méretet 800 byte-ra. [138] Olvassuk vissza az rst0-ra kiírt pro3 fájlt a dd segítségével pro3.dd néven.

Hasonlítsuk össze az eredetivel. [139] Írjuk ki a rst0-ra a pro2 fájlt a dd segítségével. Állítsuk be az input blokk méretet 80

byte-ra, az output blokk méretet 800 byte-ra, valamint végeztessünk ASCII => EBCDIC konverziót.

[140] Olvassuk vissza a rst0-ra kiírt pro2 fájlt a dd segítségével pro2.dd néven. Hasonlítsuk

össze az eredetivel. Majd dd segítségével állítsuk vissza az ASCII táblát. Hasonlítsuk össze az eredetivel.

Példák a cpio használatára

[141] Mentsük el az aktuális katalógus tartalmát cpio segítségével a /dev/rfd0c-re.

Page 314: unix kézkönyv

UNIX felhasználói ismeretek

316

[142] Állítsuk vissza a mentés tartalmát a tmp katalógusban. [143] Mentsük el a bin katalógus tartalmát cpio segítségével a /dev/rst0-ra. [144] Állítsuk vissza a mentés tartalmából a ".out"-ra végzõdõ fájlokat a tmp katalógusban. [145] Mentsük el az work katalógus tartalmából a ".c"-re, illetve ".h"-ra végzõdõ fájlokat

cpio segítségével a tmp/sources.cpio fájlba. [146] Állítsuk vissza a mentés tartalmából a nem ".h"-ra végzõdõ fájlokat a tmp

katalógusban. [147] Állítsuk vissza a mentés tartalmából azokat a fájlokat, melyek nevében szerepel a

"main" szó.

[148] Mentsük el azokat a fájlokat melyek nevében szerepel a "user" szó. A cpio által létrehozott backup fájl tmp/users.cpio legyen.

[149] Mentsük el cpio segítségével az egész munkaterületünket. A cpio által létrehozott backup fájl tmp/backup.cpio legyen.

Példák a tar használatára

[150] Mentsük el tar segítségével az egész munkaterületünket a /dev/rfd0c-re (azaz a floppyra). A mentés során alkalmazzunk olyan opciót, melynek hatására a tar kilistázza az elmentett fájlok neveit.

[151] Állítsuk vissza tar segítségével az egész munkaterületünket a /dev/rfd0c-rõl a tmp katalógusba. A visszaállítás során alkalmazzunk olyan opciót, melynek hatására a tar kilistázza a visszaállított fájlok neveit.

[152] Mentsük el tar segítségével a doc katalógusból a ".txt"-re végzõdõ fájljainkat a /dev/rst0-ra (azaz a szalagra). A mentés során alkalmazzunk olyan opciót, melynek hatására a tar kilistázza az elmentett fájlok neveit, valamint a blokk faktort változtassuk meg 126-ra.

[153] Listáztassuk ki a tar programmal a korábban elmentett fájlokat a /dev/rst0-ról. [154] Állítsuk vissza a tmp katalógusban a bevezetõ.txt nevû fájlt (vagy tetszõleges, létezõ

fájlt) a tmp katalógusba.

[155] Másoljuk le tar segítségével a work katalógus összes ".c" végzõdésû fájljait a tmp katalógus alá.

Page 315: unix kézkönyv

Függelék Feladatgyûjtemény

317

[156] Mentsük el a munkaterületünket a "server" gépen levõ floppy egységbe rakott floppyra. (rsh parancs)

[157] Állítsuk vissza a "server" gép floppy egységérõl a tar-ral mentett állományainkat a tmp katalógus alá.

[158] Mentsük el tar segítségével az egész munkaterületünket a tmp/home.tar nevû fájlba.

A mentés után szelektíven állítsuk vissza a ".c"-re végzõdõ fájlokat a tmp katalógus alá.

Példák a compress, uncompress, zcat használatára

[159] A compress segítségével tömörítsük a work/main.c nevû fájlt. Tömörítés után vizsgáljuk meg a work katalógus tartalmát.

[160] Az uncompress segítségével állítsuk vissza a work/main.c nevû fájlt. Visszaállítás

után vizsgáljuk meg a work katalógus tartalmát. [161] A compress segítségével tömörítsük a work katalógus összes ".c", ".h" végzõdésû

fájljait. Tömörítés után vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét.

[162] Az uncompress segítségével állítsuk vissza a work katalógus összes ".c", ".h"

végzõdésû fájljait. A visszaállítás után vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét.

[163] A compress segítségével tömörítsük a doc/project.doc fájlt. Tömörítés után

vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét, és nem írja felül az eredeti fájlt, hanem helyette létrehozza a doc/doc.Z fájlt.

[164] Másoljuk le a doc/doc.Z fájlt a proj.doc.Z fájlba. Hajtsuk végre azokat az

utasításokat, melyek során a doc/doc.Z tömörített fájl visszaállítása során megmarad, míg a doc/proj.doc.Z fájl helyettesítõdik a doc/proj.doc állománnyal.

[165] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá. [166] Mentsük el cpio segítségével az egész munkaterületünket. Tömörítsük a cpio által

elkészített archivumot. A tömörített fájl neve: tmp/home.cpio.Z legyen. (I/O átirányítás)

[167] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá.

Page 316: unix kézkönyv

UNIX felhasználói ismeretek

318

[168] Mentsük el tar segítségével az egész munkaterületünket. Tömörítsük a tar által elkészített archivumot. A tömörített fájl neve: tmp/home.tar.Z legyen. (I/O átirányítás)

[169] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá.

Page 317: unix kézkönyv

UNIX felhasználói ismeretek

319

FELADATOK MEGOLDÁSA UNIX alapfogalmak

[1] Deklaráljunk a saját alapkatalógusunkban alkatalógusokat az alábbi nevekkel: bin, tmp, box, work, work/store.

$ cd $ mkdir -p bin tmp box work/store A mkdir egyetlen opciója segítségével több, egymásból származtatott katalógust is

lehet csinálni.

[2] Változtassuk a fenti katalógusok engedélyeit az alábbiakra: bin: mindenki számára kereshetõ-olvasható, és csak a tulajdonos

számára írható. box: mindenki számára csak írható, a tulajdonos számára olvas-

ható is, a csoporttársak keresni is tudnak benne. Menjünk az alapkatalógusunkba, ha még nem voltunk ott, és nézzük meg, hogy

jelenleg milyen jogok érvényesek a katalógusainkra: $ cd; ls -l

A következõ változtatásokat hajtsuk végre: $ chmod a-w bin # senki sem írhat $ chmod +rx bin # mindenki kereshet és olvashat $ chmod u+w bin # mostmár a tulajdonos írhat is Más módon is átállíthatjuk az engedélyeket: $ chmod 622 pbox

[3] Bõvítsük a PATH változót úgy, hogy a saját tmp katalógusunkat elõbb érje el, mint bármelyik másik katalógust, ami a PATH változóban szerepel.

$ PATH=$HOME/temp:$PATH $ echo $PATH Azaz a PATH változó értéke az új elérési utat és a változó régi értékét is tartalmazza. [4] Bõvítsük a PATH változót úgy, hogy a saját work katalógusunkat késõbb érje el, mint

bármi más katalógust, ami a PATH változóban szerepel. $ PATH=$PATH:$HOME/work $ echo $PATH A két példa együtt azt hivatott megmutatni, hogy a környezeti változók tartalma egy

string, amit egy másik stringgel egyesíteni (konkatenálni) lehet.

[5] Hova vezet a munkakatalógusban kiadott cd ../..

Page 318: unix kézkönyv

UNIX felhasználói ismeretek

320

parancs? A cd ../.. parancs két katalógussal „feljebb” vezet a katalógus fában.

[6] Készítsünk (a cat parancs segítségével) egy forras nevû fájlt az alábbi tartalommal: baba szep baba abba alma eper szilva dinnye 6darab $ cat >forras baba szep baba abba alma eper szilva dinnye 6darab ^d

Page 319: unix kézkönyv

Függelék Feladatgyûjtemény

321

[7] Készítsük el a forras fájl „nyomtatási tükörképét” (a pr parancs által létrehozott változatát) a temp nevû fájlban. Hogyan tudnánk ezt mindjárt kinyomtatni (pr és lp parancs)?

$ pr forras > temp; lp temp Ha a pr parancs outputját pipe-oljuk a „nyomtatóhoz”: $ pr forras | lp

Nem pártolandó de ilyen megoldás is mûködik: $ pr forras>/dev/lpn ahol /dev/lpn a konkrét perifériameghajtó neve.

[8] Készítsünk másolatokat a forras fájlról a work, és tmp katalógusokban. Legyen köztük olyan, amelyben kétszer is benne van az eredeti fájl. (Az új fájlokra a továbbiakban forr1 és forr2 néven fogunk hivatkozni.)

$ cat forras >work/forr1 $ cat forras forras >tmp/forr2

[9] Tegyük a tmp katalógusban lévõ fájlunkat írásvédetté. $ chmod -w ../tmp/forr2

[10] Az alapkatalógusban lévõ forras fájlhoz láncoljunk hozzá egy forras és egy forras9 nevû fájlt a work katalógusban. Nézzük meg az eredeti fájl láncszámát.

$ cd; ln forras ../work/forras; ln forras work/forras9 $ ls -l forras

[11] Töröljük ki a tmp-ben lévõ forr2 fájlt. $ rm $HOME/tmp/forr2 A UNIX komolyan veszi az írás-olvasási jogokat. Ezért így a törlés nem sikerülhet,

mert a fájl írásvédett. Elõbb a tulajdonosnak, azaz nekünk, írhatóvá kell tenni. (Ezt elérhetjük a chmod paranccsal történõ visszaállítással, de úgy is, hogy az rm parancsot a -f opcióval hívjuk meg, ami írásvédelem esetén is törli a fájlt - feltéve, hogy a mi tulajdonunkban van!)

Hasonló meglepetések érhetik a felhasználót, ha egy számára írásvédett katalógusba

akarna valamit belemásolni. Tehát a megoldás: $ cd $HOME/tmp; chmod u+w forr2 $ rm forr2 vagy: $ rm -f $HOME/tmp/forr2

Page 320: unix kézkönyv

UNIX felhasználói ismeretek

322

[12] Nézzük meg, work mely fájljainak van egynél nagyobb linkszáma. $ ls -l work

[13] Nézzük meg, hogy mely fájlnevek tartoznak azonos fájlhoz a work katalóguson belül. $ ls -li work Az azonos fájlhoz tartozó linkek i-node száma azonos.

[14] Készítsünk egy egynél nagyobb linkszámú és egy pontosan 1 linkszámú fájlból összefûzve egy új fájlt a munkakatalógusunkban.

$ cd; cat tmp/forr1 forras >forr3

[15] Nézzük meg, hogy milyen rejtett fájlok vannak az alapkatalógusban. $ cd; ls -a

[16] Számoljuk meg, hogy hány elem van a /dev katalógusban. $ ls /dev | wc -l Az ls parancs soronkénti kimenetét fûzzük a wc parancshoz.

[17] Listázzuk ki a /dev katalógusból a négybetûs, tty-al kezdõdõ fájlok neveit. $ ls /dev/tty? A shell a '?' karakter helyére egyetlen, de tetszõleges karaktert helyettesít. [18] Listázzuk ki a /dev katalógusból a 't'-vel kezdõdõ, 3-8-as számok egyikére végzõdõ

fájlok neveit. $ ls /dev/t*[3-8]

[19] Számoljuk meg, hogy hány olyan név van a /dev katalógusban, amelyben az 0..9 számjegyek egyike szerepel.

$ ls /dev/*[0-9]* | wc -l Itt is a shell mintaillesztésérõl van szó. Megcsinálhattuk volna másképp is: $ ls /dev | grep '.*[0-9].*' | wc -l

[20] Listázzuk ki a /dev katalógusból a csak egy számjegyet tartalmazó fájlok neveit. $ ls | grep '^[^1-9]*[1-9][^1-9]*$' | wc -l Az elõzõ példával együtt a mintaillesztés szabályaiban rejlõ érdekességeket mutatja.

[21] Nézzük meg, hogy hány végrehajtható fájl van a /bin katalógusban. $ ls -l /bin | grep '^-..x' | wc -l Itt nem használhatjuk a shell mintaillesztési mechanizmusát, mert az csak a fájlnevekre

illeszt.

[22] Térjünk vissza a work katalógusba. (Figyelem, a legkevesebb karakter leütésével!)

Page 321: unix kézkönyv

Függelék Feladatgyûjtemény

323

cd; cd work

[23] Olvassuk ki a munkakatalógus tartalmát, de ne a „szabályos” ls paranccsal (lásd: od) od -c .

Page 322: unix kézkönyv

UNIX felhasználói ismeretek

324

[24] Mi a különbség az alábbi parancsok végrehajtásában? ls ls -r ls -F ls * ls -R ls * Az ls kilistázza a fájl és katalógusneveket. Az ls -r csak a kiírt nevek sorrendjét fordítja meg az elõzõhöz képest. Az ls -F a nevek végén jelzi, hogy katalógus, közönséges, vagy végrehajtható fájlról

van-e szó. Az ls * hatására a kurrens katalógusban lévõ összes fájl, illetve a kurrens katalógusban

lévõ alkatalógusok fájljainak nevét írja ki. Az ls -R rekurzivan kiírja a kurrens katalógus alatti teljes állományfát, nem csak két

szintjét, mint az ls *. [25] Írassunk ki az echo paranccsal a képernyõre három csillagot. Hányféleképp tudjuk ezt

megtenni? $ echo "***" $ echo '***' $ echo \*\*\* Mindhárom esetben a csillag speciális jelentését kellett feloldani.

[26] Nézzük meg a shell-változók értékeit, majd az exportált (környezeti) shell-változókét. $ set Az argumentumok nélkül kiadott set parancs kiírja az összes shell-változót, és

beállított értékeiket. $ env Az argumentumok nélkül kiadott env parancs kiírja az összes környezeti változót, és

beállított értékeiket.

Page 323: unix kézkönyv

Függelék Feladatgyûjtemény

325

[27] Írassuk ki a saját nevünkkel azonos nevû shell-változónak a tartalmát. $ echo $demo (Emberi számítás szerint ilyen nevû shell-változót még senki nem hozott létre, ezért a

tartalma üres.)

[28] Készítsünk magunknak egy „útvonal”shell-változót ami a gyakran látogatott work, illetve tmp katalógusba vezet.

$ wdir=$HOME/work $ tdir=$HOME/tmp

[29] Menjünk a /etc katalógusba, és ott olvassuk el (listázzuk ki) a work/forras9 nevû fájlunkat, az elõbb definiált útvonalváltozó segítségével:

$ cd /etc; cat $wdir/forras9

A vi kezelése [30] Hozzunk létre egy új fájlt a vi editorral. 1; vi és :w filename 2; vi filename

[31] Indítsuk el a vi editort "read only" üzemmódban. 1; vi -R filename 2; view filename

[32] Lépjünk ki a vi-ból. Hogyan lehet mentéssel, illetve mentés nélkül kilépni? 1; ZZ 2; :wq <RETURN> 3; :q! <RETURN> 4; :q <RETURN>

[33] Pozicionáljuk a kurzort egy karakternyit le, föl, jobbra, balra. /Ügyeljünk az aktuális üzemmódra, kurzormozgató nyilak nélkül dolgozzunk!/

hjkl

[34] Pozicionáljuk a kurzort 4 karakternyit le, föl, jobbra, balra. /ügyeljünk az aktuális

üzemmódra, kurzormozgató nyilak nélkül dolgozzunk!/ 4h4j4k4l

[35] Pozicionáljuk a kurzort jobbra, balra egy szóval, majd az adott soron belül 2-3 szóval jobbra, balra. Mi történik akkor, ha az adott sorban (jobbra, balra) kevesebb szó található a megadottnál?

Page 324: unix kézkönyv

UNIX felhasználói ismeretek

326

a; w b b; 2b 3w c; 10w 20b

[36] Pozicionáljuk a kurzort a képernyõ tetejére, közepére, aljára. HML

[37] Lapozzunk két és fél oldalt elõre, majd másfél oldalt vissza. CTRL-F, CTRL-F, CTRL-D, CTRL-B, CTRL-U

[38] Mozgassuk a kurzort a szöveg utolsó sorára. 1; G 2; :$ <RETURN>

[39] Mozgassuk a kurzort a szöveg elsõ sorára. 1; 1G 2; :1 <RETURN>

[40] Mozgassuk a kurzort a szöveg 20. sorára. 1; 20G 2; :20 <RETURN>

[41] Mozgassuk a kurzort tiz sorral elõre, majd vissza. a; :.+10 <RETURN> b; :.-10 <RETURN>

[42] Mozgassuk a kurzort az utolsó elõtti 6. sorra. :$-6 <RETURN>

[43] Mozgassuk a kurzort az aktuális sor elsõ karakterére, majd az utolsóra. a; 0 b; $

[44] Mozgassuk a kurzort az aktuális sor tizedik, majd az utolsó elõtti tizedik karakterére. a; 0 10l b; $ 10h

[45] Mozgassuk a kurzort az aktuális sor második majd utolsó szavára a; 0 2w b; $ b

[46] Indítsuk el úgy a vi editort, hogy indítás után az editált fájl 10. sorára álljon. vi +10 filename

[47] Írjunk be az utolsó elõtti 5 sor második szava elé egy tetszõleges szöveget /pl.: cica mica/.

Page 325: unix kézkönyv

Függelék Feladatgyûjtemény

327

G5kwicica mica<ESC>

[48] Írjunk be az 5. sor utolsó szava mögé egy tetszõleges szöveget /pl.: EZ ITT A SOR VEGE/.

1; 5G$aEZ ITT A SOR VEGE<ESC> 2; 5GAEZ ITT A SOR VEGE<ESC>

[49] Írjunk be az utolsó sor elsõ szava elé egy tetszõleges szöveget /pl.: UTOLSO SOR/. 1; GIUTOLSO SOR<ESC> 2; GiUTOLSO SOR<ESC>

Page 326: unix kézkönyv

UNIX felhasználói ismeretek

328

[50] Írjunk be az elsõ sor elé egy tetszõleges szöveget /pl.: EZ ITT A HEADER HELYE/. 1; 1GOEZ ITT A HEADER HELYE<ESC> 2; :1 <RETURN> OEZ ITT A HEADER HELYE<ESC> 3; :1 <RETURN> 0 iEZ ITT A HEADER HELYE<RETURN><ESC> 4; 1GIEZ ITT A HEADER HELYE<RETURN><ESC>

[51] Írjunk be az utolsó sor mögé egy tetszõleges szöveget /pl.: EZ ITT A FOOTER

HELYE/. 1; GoEZ ITT A FOOTER HELYE<ESC> 2; :$<RETURN>oEZ ITT A FOOTER HELYE<ESC> 3; :$<RETURN>$aEZ ITT A FOOTER HELYE<RETURN><ESC> 4; GA<RETURN>EZ ITT A FOOTER HELYE<RETURN><ESC>

[52] Álljunk egy szó közepére, s módosítsuk a az adott szót /például mozdonyfuto -> mozdonyvezeto).

ff cwvezeto<ESC>

[53] Módosítsunk egyszerre három, egy sorban levõ és egymás melletti szót a szövegünkben.

1; 3cwEZZEL A SZOVEGGEL<ESC> 2; c3wEZZEL A SZOVEGGEL<ESC>

[54] Helyettesítsük az adott sor utolsó négy szavát. 1; $4b4cwITT A SOR VEGE<ESC> 2; $4bc$ITT A SOR VEGE<ESC> 3; $4bCITT A SOR VEGE<ESC>

[55] Módosítsuk az egész sort. 1; 0c$EZ LETT A SORBOL<ESC> 2; ccEZ LETT A SORBOL<ESC>

[56] Töröljük ki a kurzortól jobbra esõ karaktert, majd helyére szúrjunk be egy szöveget. 1; lxiEZT JOL BESZURTUK<ESC> 2; sEZT JOL BESZURTUK<ESC>

[57] Helyettesítsük a kurzor alatti karaktert az 'A' betûvel. 1; xiA<ESC> 2; rA

[58] Helyettesítsük kurzor utáni karaktereket. REZ LETT HELYETTESITVE<ESC>

[59] Egyesítsük az 5. és 6. sort. 5GJ

Page 327: unix kézkönyv

Függelék Feladatgyûjtemény

329

[60] Kis betûvel írtuk egy fejezet címét (bevezeto); mozgassuk a kurzort a szó elejére és konvertáljuk a kisbetûket nagybetûre, majd írjuk vissza kisbetûre.

8~b8~

[61] Álljunk egy tetszõleges sorra. Töröljük ki a kurzortól jobbra esõ szót. dw

[62] Töröljük ki az adott sor utolsó négy szavát. 1; $4b4dw 2; $4bd$ 2; $4bD

[63] Töröljük ki az adott sor elsõ négy karakterét. 04x

[64] Szüntessük meg, azaz állítsuk vissza az utolsó törlés elõtti állapotot. u

[65] Állítsuk vissza az adott sor eredeti tartalmát /a soron végzett összes módosítás megszüntetése/.

1; U 2; :u <RETURN>

[66] Töröljük ki az elsõ 5 sort. :1,5 d <RETURN>

[67] Töröljük ki az utolsó 5 sort. :$,$-5 d <RETURN>

[68] Töröljük a kurzor aktuális sora körül elhelyezkedõ sorokat /+- 2 sort/. :.-2,.+2 d <RETURN>

[69] Töröljük ki az elsõ sort és másoljuk át az utolsó sorba. 1; 1GddGP 2; :1,1 m $ <RETURN>

[70] Duplázzuk meg a 9. sort. 1; 9GYp 2; 9Gyyp 3; 9GddPP 4; :9,9 co 9 <RETURN>

[71] Cseréljük fel a szöveg elsõ és utolsó öt sorát. a; :1,5 m $-5 <RETURN> b; :$-5,$ m 0 <RETURN>

Page 328: unix kézkönyv

UNIX felhasználói ismeretek

330

[72] Keressük meg a szövegünkben lefelé a "the" /vagy tetszõleges más/ szót. 1; /the<RETURN> 2; :/the/<RETURN>

[73] Keressük meg a következõ elõfordulását. 1; n 2; / <RETURN>

[74] Keressük meg a szövegünkben felfelé a "the" /vagy tetszõleges más/ szót. 1; ?the<RETURN> 2; :?the?<RETURN>

[75] Keressük meg az editált szövegben az összes olyan sort, amely a "UNIX" szóval kezdõdik.

/^UNIX <RETURN> elsõ elõfordulás n következõ elõfordulás

[76] Keressük meg az editált szövegben azokat a sorokat, melyek a "able" karakter sorozatra végzõdnek.

/able$ <RETURN> elsõ elõfordulás n következõ elõfordulás

[77] Keressük meg az editált szövegben azokat a sorokat, melyekben olyan karakter láncok

találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, valamint ezenkívül "r", "m", "p", "g" betûket tartalmaznak.

/a[rmpg]*a <RETURN> elsõ elõfordulás n következõ elõfordulás

[78] Keressük az editált szövegben a kurzor pozíciójától visszafelé azokat a sorokat, melyekben olyan karakter láncok találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, ezenkívül csak "m"-tõl "s"-ig terjedõ karaktereket tartalmaznak.

?a[m-s]*a <RETURN> elsõ elõfordulás n visszafele következõ elõfordulás

[79] Keressük az editált szövegben a kurzor pozíciójától visszafelé azokat a sorokat, melyekben olyan karakter láncok találhatók, melyek "a" betûvel kezdõdnek és végzõdnek, valamint a két "a" között tetszõleges számú karaktert tartalmaz.

?a.*a <RETURN> elsõ elõfordulás n visszafele következõ elõfordulás

[80] Cseréljük le az adott sorban az elsõ "the" szót az "eht"-re. :s/the/eht/ <RETURN>

[81] Cseréljük le az adott sorban az összes "the" szót az "eht"-re. :s/the/eht/g <RETURN>

Page 329: unix kézkönyv

Függelék Feladatgyûjtemény

331

[82] Cseréljük le az adott sorban az összes "the" szót az "eht"-re, de minden egyes csere elõtt kérdezzen rá a cserére.

:s/the/eht/gc <RETURN>

[83] Cseréljük le az egész szövegben a sorok elsõ "the" szavát az "eht"-re. 1; :1,$s/the/eht/ <RETURN> 2; :g/the/s//eht/ <RETURN>

[84] Cseréljük le az egész szövegben az összes "the" szót az "eht"-re, rákérdezéssel. 1; :1,$s/the/eht/gc <RETURN> 2; :g/the/s//eht/gc <RETURN>

[85] Cseréljük le a kurzor sorában az elsõ olyan karakter láncot, mely "a" betûvel kezdõdik

és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

:s/a.*a/ talalt / <RETURN>

[86] Cseréljük le a kurzor soráig a szövegben az adott sor elsõ olyan karakter láncát, mely "a" betûvel kezdõdik és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

:1,.s/a.*a/ talalt / <RETURN>

[87] Cseréljük le az egész szövegben az adott sor elsõ olyan karakter láncát, mely "a" betûvel kezdõdik és végzõdik, valamint a két "a" között tetszõleges számú karaktert tartalmaz a " talalt "-ra.

:g/a.*a/s// talalt / <RETURN> :1,$s/a.*a/ talalt / <RETURN>

[88] Cseréljük le az egész szövegben azokat a sorokat melyekben csak az "EXAMPLES" szöveg található "PELDAK"-ra.

:1,$s/^EXAMPLES$/PELDAK/ <RETURN> :g/^EXAMPLES$/s//PELDAK/ <RETURN>

[89] Keressük meg a kurzor sorától +- 5 sorban található, a sor elején "A"-val kezdõdõ és szintén "A"-val záruló tetszõleges hosszúságú karakterláncokat, majd írjuk be elé a "Minta: " szöveget.

:.-5,$+5s/^A.*A/Minta: &/ <RETURN>

[90] Keressük meg a teljes szövegben azokat a mintákat, melyek "A"-val kezdõdnek, és utána tetszõleges számú 'l' és 'z' közti karaktereket tartalmaznak. Az illeszkedõ szöveget tegyük "[]" közé. Minden egyes csere elõtt kérdezzünk rá a cserére.

:g/A[l-z]*/s//\[&\]/gc <RETURN>

[91] A kurzor sora mögé olvassuk be egy másik szövegfájl tartalmát. :r filename <RETURN>

Page 330: unix kézkönyv

UNIX felhasználói ismeretek

332

[92] A 10. sor mögé olvassuk be egy másik szövegfájl tartalmát. :10 r filename <RETURN>

[93] A kurzor sora mögé olvassuk be az aktuális katalógus tartalmát. :r !ls -la <RETURN>

[94] Az editált szövegünket írassuk ki egy "filename" nevû fájlba. :w filename <RETURN>

[95] Az editált szövegünk elsõ 30 sorát írassuk ki egy "filename" nevû fájlba. :1,30 w filename <RETURN>

[96] Térjünk át egy másik ("filename" nevû) fájl editálására. :e filename <RETURN>

[97] Indítsuk el a vi editort három editálandó állománnyal. Próbáljuk ki hogyan lehet áttérni a következõ fájlok editálására. Hogyan lehet átlépni az alternatív fájl editálására?

vi file1 file2 file3 :n <RETURN> :n <RETURN> CTRL-^ :e # <RETURN>

[98] Lépjünk át "ex" módba, majd vissza. Q ex mód :vi <RETURN> vi mód

[99] Írassuk ki a vi editorral a konfigurációs paramétereit. :set <RETURN>

Page 331: unix kézkönyv

Függelék Feladatgyûjtemény

333

[100] Állítsuk be az aktuális mód kiíratást. Figyeljük meg ennek hatását. :set showmode <RETURN>

[101] Állítsunk be sorszám kiírást. Figyeljük meg hatását. :set number <RETURN> :set nonumber <RETURN>

[102] Állítsuk be az automatikus mentés funkciót. :set autowrite <RETURN>

[103] Változtassuk meg az újsor nyitás margóméretét (wrapmargin) 10-re. Nézzük meg hatását.

:set wrapmargin=10 <RETURN>

[104] Állítsuk át a tabulátor méretét 8-ról 4-re. Vizsgáljuk meg az átállítás hatását. :set tabstop=4 <RETURN>

[105] Írassuk ki a vi belsõ paramétereit. :set all <RETURN>

[106] Készítsünk a vi számára lokális inicializáló fájlt, melyben beállítjuk a mód kiíratást, automatikus mentést és megváltoztatjuk a tabulátor méretét.

cd $home vi .exrc iset showmode<RETURN> set autowrite<RETURN> set tabstop=4<RETURN><ESC>ZZ

A shell és a segédprogramok [107] Írjuk ki a képernyõre: Most a ...ban vagyok ahol a pontok helyére a HOME változó tartalma kerüljön. $ echo "Most a ${HOME}ban vagyok" $ echo Most a ${HOME}ban vagyok

A gyakorlatnak két tanulsága is van: — Az idézõjelben lévõ és az idézõjel nélküli stringet a shell egyaránt kielemzi abból a

szempontból, hogy be kell-e helyettesítenie egy shell-változó értékét, azaz a változónév behelyettesítés ellen a dupla aposztróf nem véd.

— A kapcsos zárójel jelezte a shell-változó nevének határait. Ha nem használjuk, egyes esetekben, hasonló nevû shell-változók esetén kétértelmû lenne a változónév értékelése (ha például létezne egy HOMEban nevû shell-változó, annak értéke íródott volna ki; shell implementációtól függõen az is lehetséges, hogy ha HOMEban nevû változó nincs, akkor az üres stringet írja ki.) Mindezek miatt erõsen tanácsoljuk, hogy mindig zárójelezzük a változóneveket!

Page 332: unix kézkönyv

UNIX felhasználói ismeretek

334

[108] Hogyan lehet a képernyõre írni, hogy A $HOME erteke ... $ echo "A \$HOME értéke $HOME" A \ jel feloldja a $ jel speciális jelentését.

[109] Írjuk ki a képernyõre, hogy date Fog valami érdekes ettõl történni? Hogyan érhetõ el, hogy az echo a napi dátumot írja

vissza? $ echo date Kiírja hogy date, ebben a stringben semmi nem jelzi, hogy UNIX parancs. $ echo `date` $ echo "`date`" Mindkét esetben az éles-ékezet pár jelzi a shell-nek, hogy UNIX parancs eredménye

kerül az argumentumlistába. $ echo '`date`' Az „egyszeres” idézõjel elnyomja az éles ékezet hatását.

Page 333: unix kézkönyv

Függelék Feladatgyûjtemény

335

[110] Nézzük meg, hogy a forras nevû fájlban van-e "e" betûvel kezdõdõ sor? $ grep '^e.*' forras Csak a sor elején lévõ "e" betûre illeszkedik a minta. [111] Nézzük meg, hogy a forras nevû fájl mely soraiban van "e" betû. $ grep e forras A sorban bárhol elõforduló "e" betûre illeszkedik a minta.

[112] Nézzük meg, hogy a forras nevû fájlban hány mássalhangzóval kezdõdõ sor van? $ grep '^[^aeiouAEIOU]' |wc -l A magánhangzókat könnyebb felsorolni.

[113] Keressünk egymás utáni azonos betûket a forras fájlban. Használjuk a minta kijelölését, és számlált elõfordulását.

$ grep '(\(.\)\1\{1,80\})' forras

[114] Nézzük meg, hogy a forras nevû fájlban van-e 6-os számjegy. $ grep 6 forras

[115] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor, amiben nincs 6-es számjegy. $ grep '^[^6]*$' forras vagy: $ grep -v '6' forras

[116] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor ahol a sor utolsó két karaktere azonos az elsõ kettõvel?

$ grep '^\(..\).*\1$' forras

[117] Nézzük meg, hogy a forras nevû fájlban van-e olyan sor amiben van polindrom. (4 betûs)

$ grep '^\(.\)\(.\).*\2\1$' forras Mindkét példában egy elõzõleg megjelölt mintára hivatkozunk. [118] Írjuk bele a hónapok neveit, összevissza sorrendben egy honap nevû fájlba.

Használjuk a beágyazott input ("here document") mechanizmusát. $ cat >honap<<"ev vege" dec marc . . Jun "ev vege" $ cat honap [119] Rendezzük a honap fájl sorait (sort parancs)

Page 334: unix kézkönyv

UNIX felhasználói ismeretek

336

— ábécé szerinti sorrendbe; — csináljunk minden betûjébõl nagybetût (tr parancs); — rendezzük a csupa nagybetûs hónapok fájlt természetes sorrendbe. $ sort honap $ tr -c "[A-Z]" "[a-z]" <honap >month $ sort -M month ev [120] Írjuk ki a képernyõre a /etc/passwd fájl tartalmát a bejelentkezési nevek ábécé

sorrendje szerint. $ sort /etc/passwd [121] Írassuk ki, hogy egy fél perc múlva milyen folyamatok futnak a gépen, közben pedig

végezzünk tetszõleges más tevékenységet (például készítsünk egy fájlt cat utasítással). (sleep és háttérben futtatás)

$ (sleep 30;ps)& $ cat > akarmi idohuzas ^d [122] Írjunk egy lscim nevû függvényt, ami az ls parancs kiadása elõtt kiírja a kilistázott

katalógus nevét. $ lscim { echo "A munkakatalógusunk $PWD" ls $1 } Hogyan lehetne több paraméter feldolgozására alkalmassá tenni e függvényt? (belsõ

ciklus, $@)

Shell programozás [123] Írassuk ki, és számoljuk meg, hogy egy script indítása után hány shell fut. $ cat >shellek ps | grep sh >$HOME/tmp/tmp echo "a futo sh szama `cat $HOME/tmp/tmp | wc -l`" echo "megpedig az alabbiak \n `cat $HOME/tmp/tmp`" [124] Nézzük meg, hogy egy bizonyos felhasználó dolgozik-e, és fut-e épp folyamata. $ cat >dolgozik if who | grep $1 >/dev/null; then echo "$1 dolgozik" if ps -ef | grep $1; then echo "ezek a folyamatok tartoznak hozza" fi else echo "Ejnye, a $1 meg lustalkodik" fi

Page 335: unix kézkönyv

Függelék Feladatgyûjtemény

337

[125] Csináljunk egy programot, ami semmi mást nem tesz, mint visszaadja a kapott argumentumokat, amiket azonban különbözõ módokon fejt ki. Próbálgassuk különbözõ argumentumokkal meghívni. (Például 1 2 3, "1 2" 3, 1 '2 3' stb.).

Az alábbi script-et hozzuk létre, mondjuk argprob néven: echo 'A $* -os valtozat' echo $* echo 'A "$*" -os valtozat' echo "$*" echo 'A $@ -os valtozat' echo $@ echo 'A "$@" -os valtozat' echo "$@"

[126] Írjunk egy modv nevû script-et ami a tulajdonos és a vele egy csoportban lévõ

számára végrehajthatóvá tesz egy programot, majd átteszi a /$HOME/bin katalógusba. Hajtassuk végre saját magán.

chmod ug+x $1 mv $1 $HOME/bin

Ezekután hajtsuk végre elõször saját magán. $ sh modv modv

[127] Írjunk „ébresztõórát” ami egész órakor üzenetet küld a képernyõre. Tegyük végrehajthatóvá, másoljuk a /$HOME/bin katalógusba és indítsuk el a háttérben. (date parancs)

Mindenek elõtt figyeljük meg, hogy a date parancs milyen formátumban adja az eredményét, majd a grep paranccsal kerestessünk alkalmas mintát.

until date | grep ':00:'>/dev/null do sleep 30 done echo Ido van!!! $ modv alarm $ alarm & $ Mi a hátulütõje ennek a megoldásnak?

[128] Írjunk egy fejlec nevû programot, ami C nyelvû vagy shell parancsokból álló programok elsõ sorába az aktuális dátumot írja kommentként. Tegyük végrehajthatóvá és másoljuk be a /$HOME/bin katalógusba.

A fejlec programot három vagy négy argumentummal lehet majd hívni, azaz fejlec f1 f2 c1 c2 ahol f1 a kiinduló, f2 az eredmény fájl, c1 a komment sor elejét, c2 a komment sor

végét jelölõ string. $ cat >fejlec if test $# ge 3; then case $# in

Page 336: unix kézkönyv

UNIX felhasználói ismeretek

338

3) vege=$3 ;; 4) vege=$4 ;; esac echo $3 `date` $vege>$2 cat $1>>$2 else echo Keves az argumentum! fi ^d $ modv fejlec

[129] Hozzunk létre egy sorsz nevû programot, ami az f1 fájl sorainak számozásával állítja elõ az f2 állományt. Tegyük végrehajthatóvá és másoljuk be a $HOME/bin katalógusba.

Elõször készítsünk egy segédprogramot. $ cat >srsz k=1 while sor=`line`; do echo $k $sor k=`expr $k + 1` done ^d $ modv srsz $ cat >sorszam $ cat $1 | srsz > $2 ^d $ modv sorszam

[130] Van-e ebben az évben hétfõvel kezdõdõ hónap? Ha találunk ilyet, írjuk ki betûkkel a hónap nevét. (cal parancs)

Nézzük meg a cal parancs outputját! $ cat >hetfo k=ures p=elso for i in 1 2 3 4 5 6 7 8 9 10 11 12; do if cal $i $1 | grep ' 6$' > /dev/null then k=nemures case $i in 1)ho=januar;; 2)ho=februar;; 3)ho=marcius;; 4)ho=majus;; 5)ho=junius;; 6)ho=julius;; 7)ho=augusztus;; 8)ho=szeptember;; 9)ho=oktober;; 11)ho=november;; 12)ho=december;;

Page 337: unix kézkönyv

Függelék Feladatgyûjtemény

339

fi if test $k='nemures'; then if test $p='elso'; then echo Az $1 evben hetfovel kezdodik p=masod fi echo $ho k=ures fi done if test $p = 'elso'; then echo Az $1. evben nincs hetfovel kezdodo honap fi ^d $ chmod u+x hetfo $ hetfo 1993

[131] Írjunk olyan script-et, ami ugyanazt a levelet ($2) elküldi a fájlban megnevezett ($1) felhasználóknak.

$ cat >postas mail `cat $1` $2 ^d $ modv postas

[132] Hogyan állapíthatjuk meg, hogy milyen shell alatt dolgozunk? Több mód is van rá: 1. Esetleg a prompt is eligazít, de legalábbis támpontot adhat. 2. Megnézzük a futó folyamatok között a ps paranccsal, hogy melyik shell-t indították

utoljára (a legmagasabb folyamatazonosítóval rendelkezõt). 3. Megnézzük a /etc/passwd fájlban, hogy a bejelentkezési nevünkhöz milyen shell

kapcsolódik. Ez azonban csak akkor helyes, ha biztosak lehetünk, hogy nem indítottunk el új shell-t a belépés óta.

Page 338: unix kézkönyv

UNIX felhasználói ismeretek

340

Mentés, visszaállítás

Példák a dd használatára [133] Írjuk ki a floppy-ra a pro1 fájlt a dd segítségével. Állítsuk be az input-output blokk

méretet 9 kilobyte-ra. 1; dd if=pro1 of=/dev/rfd0c ibs=9k obs=9k conv=sync 2; dd if=pro1 of=/dev/rfd0c bs=9k conv=sync

[134] Olvassuk vissza a floppy-ra kiírt pro1 fájlt a dd segítségével pro1.dd néven. Hasonlítsuk össze az eredetivel.

1; dd if=/dev/rfd0c of=pro1.dd ibs=9k obs=9k conv=sync 2; dd if=/dev/rfd0c of=pro1.dd bs=9k conv=sync diff pro1 pro1.dd

[135] Írjuk ki a floppy-ra a pro2 fájlt a dd segítségével. Állítsuk be az input-output blokk

méretet 4 kilobyte-ra, valamint végeztessünk kisbetû konverziót. 1; dd if=pro2 of=/dev/rfd0c ibs=4k obs=4k conv=lcase,sync 2; dd if=pro2 of=/dev/rfd0c bs=4k conv=lcase,sync

[136] Olvassuk vissza a floppy-ra kiírt pro2 fájlt a dd segítségével pro2.dd néven. Hasonlítsuk össze az eredetivel.

1; dd if=/dev/rfd0c of=pro2.dd ibs=4k obs=4k 2; dd if=/dev/rfd0c of=pro2.dd bs=4k diff pro2 pro2.dd

[137] Írjuk ki az rst0-ra (magnetic tape) a pro3 fájlt a dd segítségével. Állítsuk be az input-output blokk méretet 800 byte-ra.

1; dd if=pro3 of=/dev/rst0 ibs=800 obs=800 2; dd if=pro3 of=/dev/rst0 bs=800

Page 339: unix kézkönyv

Függelék Feladatgyûjtemény

341

[138] Olvassuk vissza az rst0-ra kiírt pro3 fájlt a dd segítségével pro3.dd néven. Hasonlítsuk össze az eredetivel.

1; dd if=/dev/rst0 of=pro3.dd ibs=800 obs=800 2; dd if=/dev/rst0 of=pro3.dd bs=800 diff pro3 pro3.dd

[139] Írjuk ki a rst0-ra a pro2 fájlt a dd segítségével. Állítsuk be az input blokk méretet 80 byte-ra, az output blokk méretet 800 byte-ra, valamint végeztessünk ASCII => EBCDIC konverziót.

dd if=pro2 of=/dev/rst0 ibs=80 obs=800 conv=ebcdic

[140] Olvassuk vissza a rst0-ra kiírt pro2 fájlt a dd segítségével pro2.dd néven. Hasonlítsuk össze az eredetivel. Majd dd segítségével állítsuk vissza az ASCII táblát. Hasonlítsuk össze az eredetivel.

1; dd if=/dev/rst0 of=pro2.dd ibs=800 obs=80 diff pro2 pro2.dd dd if=pro2.dd of=pro2.dd.ascii conv=ascii diff pro2 pro2.dd.ascii

Példák a cpio használatára

[141] Mentsük el az aktuális katalógus tartalmát cpio segítségével a /dev/rfd0c-re. cd $home ls | cpio -ocv > /dev/rfd0c

[142] Állítsuk vissza a mentés tartalmát a tmp katalógusban. cd $home/tmp; cpio -icvd < /dev/rfd0c

[143] Mentsük el a bin katalógus tartalmát cpio segítségével a /dev/rst0-ra. cd $home ls bin | cpio -ocv > /dev/rst0

Page 340: unix kézkönyv

UNIX felhasználói ismeretek

342

[144] Állítsuk vissza a mentés tartalmából a ".out"-ra végzõdõ fájlokat a tmp katalógusban. cd $home/tmp; cpio -icvd "*.out" < /dev/rst0

[145] Mentsük el az work katalógus tartalmából a ".c"-re, illetve ".h"-ra végzõdõ fájlokat cpio segítségével a tmp/sources.cpio fájlba.

cd $home ls work/*.h work/*.c | cpio -ocv > tmp/sources.cpio

[146] Állítsuk vissza a mentés tartalmából a nem ".h"-ra végzõdõ fájlokat a tmp katalógusban.

cd $home/tmp; cpio -icvdf "*.h" < sources.cpio

[147] Állítsuk vissza a mentés tartalmából azokat a fájlokat, melyek nevében szerepel a "main" szó.

cd $home/tmp; cpio -icvd `cpio -itc < sources.cpio | grep main` < sources.cpio

[148] Mentsük el azokat a fájlokat melyek nevében szerepel a "user" szó. A cpio által létrehozott backup fájl tmp/users.cpio legyen.

cd $home find . -name "*user*" -cpio tmp/USERS.cpio

[149] Mentsük el cpio segítségével az egész munkaterületünket. A cpio által létrehozott backup fájl tmp/backup.cpio legyen.

cd $home find . -depth -print | cpio -ocv tmp/backup.cpio

Példák a tar használatára [150] Mentsük el tar segítségével az egész munkaterületünket a /dev/rfd0c-re (azaz a

floppyra). A mentés során alkalmazzunk olyan opciót, melynek hatására a tar kilistázza az elmentett fájlok neveit.

cd $home tar -cvf /dev/rfd0c .

[151] Állítsuk vissza tar segítségével az egész munkaterületünket a /dev/rfd0c-rõl a tmp katalógusba. A visszaállítás során alkalmazzunk olyan opciót, melynek hatására a tar kilistázza a visszaállított fájlok neveit.

cd $home/tmp tar -xvf /dev/rfd0c

[152] Mentsük el tar segítségével a doc katalógusból a ".txt"-re végzõdõ fájljainkat a /dev/rst0-ra (azaz a szalagra). A mentés során alkalmazzunk olyan opciót, melynek

Page 341: unix kézkönyv

Függelék Feladatgyûjtemény

343

hatására a tar kilistázza az elmentett fájlok neveit, valamint a blokk faktort változtassuk meg 126-ra.

cd $home tar -cvbf 126 /dev/rst0 doc/*.txt

[153] Listáztassuk ki a tar programmal a korábban elmentett fájlokat a /dev/rst0-ról. tar -tbf 126 /dev/rst0

[154] Állítsuk vissza a tmp katalógusban a bevezetõ.txt nevû fájlt (vagy tetszõleges, létezõ

fájlt) a tmp katalógusba. cd $home/tmp tar -xvbf 126 /dev/rst0 bevezeto.txt

[155] Másoljuk le tar segítségével a work katalógus összes ".c" végzõdésû fájljait a tmp katalógus alá.

cd $home tar -cf - work/*.c | (cd tmp; tar -xfBp -)

[156] Mentsük el a munkaterületünket a "server" gépen levõ floppy egységbe rakott floppyra. (rsh parancs)

cd $home tar -cvf - ./* | rsh server dd of=/dev/rfd0c obs=9k conv=sync

[157] Állítsuk vissza a "server" gép floppy egységérõl a tar-ral mentett állományainkat a tmp katalógus alá.

cd $home/tmp rsh server dd if=/dev/rfd0c obs=9k conv=sync) | tar -tfB -

[158] Mentsük el tar segítségével az egész munkaterületünket a tmp/home.tar nevû fájlba. A mentés után szelektíven állítsuk vissza a ".c"-re végzõdõ fájlokat a tmp katalógus alá.

cd $home tar cvf tmp/home.tar ./* cd $home/tmp tar xvf home.tar `tar tf home.tar | grep '*.c'`

Példák a compress, uncompress, zcat használatára

[159] A compress segítségével tömörítsük a work/main.c nevû fájlt. Tömörítés után vizsgáljuk meg a work katalógus tartalmát.

cd $home/work compress main.c ls -la

Page 342: unix kézkönyv

UNIX felhasználói ismeretek

344

[160] Az uncompress segítségével állítsuk vissza a work/main.c nevû fájlt. Visszaállítás után vizsgáljuk meg a work katalógus tartalmát.

cd $home/work uncompress main.c ls -la [161] A compress segítségével tömörítsük a work katalógus összes ".c", ".h" végzõdésû

fájljait. Tömörítés után vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét.

cd $home/work compress -v *.c *.h ls -la [162] Az uncompress segítségével állítsuk vissza a work katalógus összes ".c", ".h"

végzõdésû fájljait. A visszaállítás után vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét.

cd $home/work uncompress -v *.Z ls -la

[163] A compress segítségével tömörítsük a doc/project.doc fájlt. Tömörítés után vizsgáljuk meg a work katalógus tartalmát. Használjunk olyan opciót, melynek hatására a compress kiírja az aktuális mûveletét, és nem írja felül az eredeti fájlt, hanem helyette létrehozza a doc/doc.Z fájlt.

cd $home/doc compress -cv project.doc > doc.Z ls -la [164] Másoljuk le a doc/doc.Z fájlt a proj.doc.Z fájlba. Hajtsuk végre azokat az

utasításokat, melyek során a doc/doc.Z tömörített fájl visszaállítása során megmarad, míg a doc/proj.doc.Z fájl helyettesítõdik a doc/proj.doc állománnyal.

cd $home/doc cp doc.Z proj.doc.Z uncompress -cv doc.Z > doc uncompress -v proj.doc.Z ls -la

[165] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá. cd $home/tmp uncompress -cv home.dump | restore -xvf -

[166] Mentsük el cpio segítségével az egész munkaterületünket. Tömörítsük a cpio által elkészített archivumot. A tömörített fájl neve: tmp/home.cpio.Z legyen. (I/O átirányítás)

cd $home find . -depth -cpio - | compress -cv > tmp/home.cpio.Z

[167] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá.

Page 343: unix kézkönyv

Függelék Feladatgyûjtemény

345

cd $home/tmp uncompress -cv home.cpio | cpio -id

Page 344: unix kézkönyv

UNIX felhasználói ismeretek

346

[168] Mentsük el tar segítségével az egész munkaterületünket. Tömörítsük a tar által elkészített archivumot. A tömörített fájl neve: tmp/home.tar.Z legyen. (I/O átirányítás)

cd $home tar -cvf - . | compress -cv > tmp/home.tar.Z

[169] Állítsuk vissza az elõbbiekben elkészített archivumot a tmp katalógus alá. cd $home/tmp uncompress -cv home.tar.Z | tar -xvfB -

Page 345: unix kézkönyv

347

TÁRGYMUTATÓ

Page 346: unix kézkönyv

UNIX felhasználói ismeretek

348

aktuális katalógus → current directory aktuális katalógus megadása → pwd parancs alapkatalógus 48 alapkönyvtár → home directory alias 219; 220; 240; 262; 263 állomány → fájl állományok láncolása → ln parancs állományok oldaltördelt listázása → pg parancs állományrendszer 48; 49; 293 argumentumok léptetése → shift utasítás aritmetikai kiértékelés → expr parancs at parancs 79; 90; 93; 94; 100; 216 átirányítás 55; 56 background process → háttérfolyamat behelyettesítés (fájlnév, parancsnév, paraméter) 130;

131; 139; 164; 250 beírt szöveg visszajelzése → echo parancs bejelentkezés → login parancs bejelentkezett felhasználól listája → who parancs bejelentkezési név 42 bekezdés 146; 152 belépés más felhasználóként → su parancs bináris fájlok listázása → od parancs blank characters → fehér karakterek blokk 50; 82; 288 Bourne shell → sh parancs BSD 18; 19; 20; 21; 29; 64; 76; 92; 94; 105; 197; 205;

275; 278; 279; 284 buffer → puffer burok → shell C shell → csh parancs cancel parancs 282 cat parancs 27; 28; 29; 55; 56; 57; 85; 89; 90; 100;

110; 122; 123; 160; 169; 170; 173; 174; 175; 176; 188; 189; 194; 196; 198; 200; 202; 203; 207; 208; 211; 215; 252; 255; 256; 262; 265

cd parancs 50; 51; 65; 70; 103; 104; 202; 218; 219; 220; 229; 230; 243; 251; 258; 263; 292

CDE → Common Desktop Environment chgrp parancs 72 chmod parancs 70; 71; 72; 101; 107 chown parancs 72 címkék 137 címtartomány 129; 130; 131; 132; 133; 138; 139; 159 cmp parancs 172; 173; 175 comm parancs 172; 173 command → Unix parancs command prompt → promptjel Common Desktop Environment 22 cp parancs 58; 59; 64; 65; 70

cpio parancs 286; 287; 288; 289 CR karakter 46; 148; 161; 294 current directory 48; 49; 51; 251 cut parancs 170; 171; 252; 265 csh → C shell csh parancs 40; 41; 47; 77; 205; 206; 207; 209; 210;

211; 213; 214; 215; 216; 218; 219; 220; 221; 223; 225; 226; 227; 228; 229; 230; 232; 233; 235; 236; 237; 240; 241; 242; 248; 250; 251

csoportazonosító 42; 168 csoportazonosító módosítása → chgrp parancs csőhálózat 169 csővezeték 57; 69; 86; 87; 88; 166; 175; 191; 222;

237; 254; 255; 256 daemon 34; 38 date parancs 83; 84; 88; 89; 160; 162; 191; 192; 194;

252; 261; 265 dátum megadása → date parancs dd parancs, fájlok mentése 145; 147; 152; 176; 177;

286; 292; 293 démon → daemon device driver 26; 69 diff parancs 172; 173; 174; 175 directory ld katalógus DOS 18; 24; 25; 43; 45; 47; 49; 52; 55; 58; 59; 81; 87;

98; 105; 161; 164; 166; 218; 219; 249; 251; 266; 269; 293; 294

dos2unix parancs 294 duplex pipe → kétirányú csőhálózat echo parancs 29; 55; 85; 93; 94; 98; 99; 100; 103;

106; 107; 109; 110; 123; 175; 181; 182; 183; 185; 191; 192; 196; 197; 198; 200; 202; 203; 211; 212; 219; 224; 225; 228; 229; 232; 243; 252; 254; 255; 256; 257; 258; 259; 260; 261; 262; 264; 265; 267; 273; 276

ed editor 55; 56; 70; 79; 80; 83; 100; 109; 111; 115; 116; 117; 118; 119; 121; 122; 123; 124; 125; 128; 129; 141; 159; 164; 173; 174; 175; 187; 188; 189; 194; 210; 213; 228; 263

egrep parancs 170 egyfeladatos működés 24 egyfelhasználós működés 24; 59 elektronikus levelek küldése → mail parancs elérési út 50; 95; 253; 287; 291 env parancs 211 escape karakter 79; 222 eseménybehelyettesítés 240 eszközmeghajtó program ld device driver exit változó 106; 166; 182; 190; 193; 197; 198; 199;

200; 203; 206; 211; 230; 236; 243; 250; 252; 253

Page 347: unix kézkönyv

Tárgymutató

349

export utasítás 75 expr parancs 179; 181; 182; 183; 196; 197; 237; 239;

243; 244; 247; 248 fájl 17; 26; 28; 29; 37; 41; 42; 43; 49; 50; 52; 53; 54;

55; 56; 57; 58; 59; 60; 61; 62; 65; 66; 67; 68; 69; 70; 71; 72; 73; 74; 80; 82; 84; 85; 87; 94; 95; 96; 97; 100; 101; 104; 105; 107; 109; 110; 111; 119; 120; 124; 125; 126; 127; 128; 130; 133; 143; 144; 145; 151; 152; 153; 154; 158; 159; 160; 162; 168; 174; 176; 184; 186; 187; 191; 202; 203; 206; 207; 208; 210; 212; 214; 217; 219; 221; 222; 226; 230; 231; 232; 233; 236; 238; 240; 241; 244; 245; 247; 248; 250; 253; 262; 266; 267; 269; 278; 279; 280; 281; 282; 284; 287; 288; 289; 290; 291; 293

fájlleíró 187 fájlnév 52; 56; 62; 97; 134; 287; 291 fájlok átnevezése, mozgatása → mv parancs fájlok azonos részeinek szűrése → uniq parancs fájlok bináris összehasonlítása → cmp parancs fájlok elejének listázása → head parancs fájlok feldarabolása → split parancs fájlok formázott listázása → pr parancs fájlok keresése az elérési úton → whereis parancs fájlok keresése → find parancs fájlok listázása → cat parancs fájlok másolása → cp parancs fájlok mentése → cpio parancs fájlok mentése → tar parancs fájlok oldaltördelt listázása → more parancs fájlok összehasonlítása → diff parancs fájlok összeolvasása → join parancs fájlok rendezése → sort parancs fájlok típusának meghatározása → file parancs fájlok törlése → rm parancs fájlok végének listázása → tail parancs fájlok végrehajthatósága 38; 43; 64; 65; 70; 71; 75;

180; 181; 293 fájlrendszer 34; 41; 42; 47; 48; 60; 63; 66; 293; 294 fájlrendszer becsatolása → mount parancs fájlrendszerek lecsatolása → umount parancs feladat 27; 37; 38; 93; 115; 241; 242; 243; 244; 245;

246; 247; 248; 249; 253; 265; 278; 282; 284; 285; 286

felhasználói azonosító 42; 168 felhasználó azonosítása → who am i parancs feltételvizsgálat a shellprogramokban → test parancs fgrep parancs 170 file descriptor → fájlleíró file → fájl

file parancs 28; 29; 41; 53; 54; 67; 70; 71; 84; 85; 95; 96; 97; 100; 107; 110; 119; 120; 130; 133; 143; 152; 153; 158; 159; 176; 187; 202; 203; 214; 219; 236; 262; 279; 282; 284; 288; 289; 290; 291

filter → szűrő find parancs 166; 179; 180; 198; 200; 201; 203; 241;

242; 288 folder → katalógus folyamat 32; 37; 38; 89; 90; 91; 137 folyamatazonosító 90; 91; 92; 197 futó folyamat kilövésének megakadályozása → nohup

parancs futó folyamat prioritásának módosítása → nice parancs futó folyamatok kilistázása → ps parancs GID → csoportazonosító grep parancs 87; 90; 111; 169; 170; 171; 191; 255;

256; 265 group id 42 gyökérkatalógus 47; 48; 49 hard link → merev láncolás háttérfolyamat 37; 90 héj → shell here document → beágyazott input hidden file → rejtett fájl history parancs 53; 180; 207; 211; 212; 213; 214; 218;

220; 221; 227; 230; 231; 244; 249; 253; 266; 267 home directory 48; 53; 75; 164; 233 hozzáférési jog 43; 50; 68; 69; 70; 72; 73; 287; 291 hozzáférési jogok módosítása → chmod parancs ideiglenes tárolótér 137 i-bög → inode i-node → inode inittab fájl 76 inode 60; 61; 62; 64; 65; 66; 67; 72 interpreter elvű működés 39 jegyzék → katalógus jelszó 29; 33; 46; 47; 73; 168 jelzőpont 120; 121; 122 job → feladat join parancs 120; 175 karakterek, szavak és sorok száma a fájlban → wc

parancs karakterkonverzió fájlokban → tr parancs katalógus 29; 42; 47; 48; 49; 50; 51; 53; 54; 57; 58;

59; 60; 62; 64; 65; 66; 68; 69; 70; 75; 233; 251; 287; 292

katalógus listázása → ls parancs katalógus váltás → cd parancs katalógusok törlése → rmdir parancs kernel 17; 24; 26; 75; 175; 240; 241; 255; 294

Page 348: unix kézkönyv

UNIX felhasználói ismeretek

350

készülékmeghajtó program → device driver kézikönyvek 27; 29 kézikönyv megjelenítése → man parancs kiindulási katalógus → home directory kijelentkezés → logout parancs kilépés 32; 53; 80; 92; 110; 186; 206; 208; 230; 245;

250; 252 kill parancs, vezérlőkarakter 79; 91; 110; 208; 241;

242; 245; 266; 270; 273; 274 konfigurációs fájl 72; 164; 263; 269; 276 konzol 35 korlátozott jogosultságú parancsvégrehajtás → rsh

parancs Korn shell → ksh parancs környezet 17 közös részek keresése → comm parancs ksh parancs 40; 41; 47; 77; 172; 205; 210; 218; 226;

228; 249; 250; 252; 254; 255; 256; 257; 258; 266; 278

láncolás → link láncolási szám → link count láncszám 50; 62; 66 link 50; 59; 60; 62; 65; 66; 68; 69 link count 50; 60 ln parancs 59; 60; 64; 65; 67; 70; 195; 196 login name 33; 46 login parancs 33; 45; 46; 47; 53; 80; 91; 92; 115; 184;

185; 206; 207; 208; 211; 230; 245; 252; 259; 269; 282; 283

logout → kilépés logout parancs 53; 80; 110; 206; 208; 230; 245; 250;

252 lpq parancs 284; 285 lpr parancs 278; 284; 285 lprm parancs 284; 286 lpstat parancs 282 ls parancs 27; 49; 50; 53; 54; 57; 58; 60; 61; 65; 69;

70; 71; 72; 74; 82; 85; 95; 96; 97; 100; 101; 107; 126; 169; 184; 195; 198; 199; 200; 201; 202; 203; 204; 214; 218; 219; 232; 233; 255; 258; 263; 265; 267; 289

Mach operációs rendszer 21 mag 42; 202; 263 mail parancs 47; 76; 86; 103; 104; 107; 185; 186; 208;

213; 227; 230; 291 MAIL változó 103; 104; 208; 227 makró 162 man parancs 28; 29; 76; 98; 103; 107; 186; 206; 227;

291 manuál → kézikönyvek

marker → jelzőpont másodlagos prompt, csoport 72; 73; 168 merev láncolás 65; 66; 68 mesg parancs 185 metakarakter 130; 131 mintakeresés fájlokban → egrep parancs mintakeresés fájlokban → fgrep parancs mintakeresés fájlokban → grep parancs mintakeresés stringben → expr parancs mintatér 126; 127; 130; 133; 134; 135; 136; 137; 138 mkdir parancs 53; 54; 70; 202 mondat 146; 147; 152 more parancs 57; 166; 200; 201; 208 Motif ablakkezelő rendszer 22 mount parancs 29; 66 multitasking → többfeladatos működés multiuser → többfelhasználós működés munkakatalógus 48; 287 mv parancs 28; 57; 58; 59; 64; 65; 70; 198; 217 nevesített puffer 155 névütközés feloldása szimbólikus linkkel 64 newgrp parancs 73 nice parancs 245 nohup parancs 92; 93 nyomtatás 76; 269; 278; 280; 282; 284 nyomtatás: indítása → lpr parancs nyomtatás: job törlése → lprm parancs nyomtatás: sor kezelése → lpq parancs nyomtatás:állapotlista → lpstat parancs nyomtatási feladat törlése → cancel parancs od parancs 176 opció 50; 53; 59; 64; 128; 165; 167; 168; 171; 177;

179; 266; 270; 275; 278; 281; 282; 283; 287; 288; 289; 290

OSF/1 operációs rendszer 21 paragrafus → bekezdés parancsértelmező 25; 38; 40; 43 parancsmód 115 parancsvégrehajtás késleltetése → sleep parancs password → jelszó passwd (file, parancs) 34; 73; 74; 168; 171; 172; 175;

199; 230; 258 path 207; 227; 228; 229; 231; 240; 246 PATH változó 64; 102; 103; 104; 105; 110; 227; 228;

229; 231; 263; 275 pattern 126; 150; 170; 183; 191; 192; 222; 238; 248;

287 pattern space → mintatér példaprogramok

Page 349: unix kézkönyv

Tárgymutató

351

bell 196; 201 bundle 201; 202; 203; 204 exch 197; 198; 201 same_nm 198; 199; 200; 201; 202; 203; 204 updt 195; 199; 200; 201 periféria 191; 288; 290; 292 permission → hozzáférési jog permutált index 27; 28 pg parancs 57; 103; 110 PID → folyamatazonosító pipe → csővezeték pipeline → csőhálózat pozicionális paraméter shell változó 102; 106; 107; 193; 195; 196; 199; 200;

226; 258; 262 pozicionáló parancs 144; 146; 147 pr parancs 74; 82; 87; 88; 177; 178; 194; 195; 203;

285 privilégizált felhasználó 34; 47; 93; 94; 95; 245; 248;

282; 286; 287; 293 process id → folyamatazonosító process → folyamat programfutás megszakítása → intr karakter programok időzített végrehajtása → at parancs program 17; 28; 29; 33; 34; 37; 38; 39; 40; 45; 46; 53;

64; 73; 74; 75; 83; 87; 97; 107; 129; 186; 202; 281; 289

prompt 33; 34; 46; 47; 81; 99; 102; 104; 207; 209; 210; 212; 227; 231; 239; 241; 251; 263

promptjel 47 prototyping 39; 165 ps parancs 91; 92; 167; 267 PS1 változó 102; 103; 104; 110; 251; 263 PS2 változó 102; 103; 104; 110; 251; 263 puffer 117; 118; 119; 120; 121; 124; 147; 149; 155;

156; 157; 272 pwd parancs 48; 49; 51; 102; 103; 158; 183; 251; 258;

267 read parancs 69; 119; 133; 181; 255; 256 regular expression → reguláris kifejezés reguláris kifejezés 120; 128; 130; 131; 159; 170; 183 (reguláris kifejezés, fájlnév) minta 120; 121; 127; 129;

130; 136; 137; 138; 150; 170; 183; 189 rejtett fájl 53 rendszergazda 33; 34; 35; 46; 47; 48; 53; 61; 67; 73;

74; 83; 86; 87; 88; 94; 199; 214; 219; 270; 276; 293

rendszermag → kernel rendszerterminál → konzol rm parancs 54; 59; 70; 83; 180; 200

rmdir parancs 54; 70 root → rendszergazda root directory → gyökérkatalógus root (directory, felhasználó) 34; 47; 48; 53; 61; 67; 73;

74; 83; 86; 87; 88; 94; 199; 214; 219; 293 rsh parancs 64; 292 secondary (prompt) 99 sed parancs, editor 111; 125; 126; 127; 128; 129; 130;

131; 132; 133; 134; 135; 137; 138; 139; 159; 160 segédprogram 24; 26; 27; 40; 165; 166; 186 set parancs 74; 84; 102; 108; 144; 163; 164; 207; 208;

211; 212; 223; 224; 225; 227; 228; 229; 230; 232; 247; 252; 253; 259; 266; 270; 281; 293

sh parancs 40; 41; 53; 64; 77; 92; 93; 94; 101; 103; 106; 107; 109; 110; 180; 202; 203; 204; 205; 206; 209; 210; 215; 216; 221; 222; 223; 224; 228; 232; 233; 238; 241; 246; 249; 250; 251; 254; 256; 259; 260; 261; 262; 264; 265; 266

shell 25; 26; 28; 29; 37; 38; 39; 40; 41; 43; 47; 52; 64; 70; 77; 78; 79; 80; 81; 83; 90; 91; 94; 95; 96; 97; 98; 99; 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 111; 121; 139; 158; 165; 166; 168; 170; 175; 177; 181; 182; 187; 189; 190; 192; 193; 194; 195; 196; 197; 199; 200; 202; 204; 205; 206; 207; 208; 209; 210; 211; 212; 213; 214; 215; 216; 218; 219; 220; 221; 222; 223; 224; 225; 226; 227; 228; 229; 230; 231; 232; 233; 234; 235; 236; 237; 238; 239; 240; 241; 242; 243; 244; 245; 246; 247; 248; 249; 250; 251; 252; 253; 254; 255; 256; 257; 258; 259; 260; 261; 262; 263; 264; 265; 266; 267; 277; 278; 280; 284; 285; 286; 287; 290; 293

shell script 41; 100; 104; 107; 125; 126; 127; 128; 132; 133; 134; 135; 136; 137; 138; 139; 231; 246; 255; 256; 264; 293

shell környezet kilistázása → env parancs shell változó 64; 102; 107; 226; 253 shell változók beállítása → set parancs shell variable → shell változó shift utasítás 200; 247 single user → egyfelhasználós működés single-tasking → egyfeladatos működés sleep parancs 192; 194; 196; 265 soremelés 132; 139; 146; 161; 273 sor olvasása a bemenetről → read parancs sort parancs 39; 81; 86; 87; 89; 117; 118; 119; 121;

122; 124; 127; 128; 131; 133; 135; 136; 137; 138; 145; 147; 150; 151; 152; 154; 156; 157; 160; 162; 163; 165; 166; 167; 168; 171; 172;

Page 350: unix kézkönyv

UNIX felhasználói ismeretek

352

173; 175; 181; 188; 192; 210; 226; 251; 254; 261; 263; 265; 266; 267; 285

sortörlés → kill karakter speciális jelentés elnyomása → escape karakter speciális karakter

eof 80; 110; 206; 208; 210; 250; 273 erase 78; 110; 208; 273; 274

speciális karaktere, soremelés 161; 272; 273; 276; 294 speciális karakterek sorvége 46; 55; 56; 57; 78; 81; 86; 157; 272; 273; 276;

288; 289 speciális karakterek, backslash karakter 132; 180; 183;

271 split parancs 186 spooling 278; 285 standard bemenet 55; 57; 84; 125; 127; 167; 275; 279;

284; 287; 292 standard error → standard hibacsatorna standard hibacsatorna 84 standard input → standard bemenet standard kimenet 55; 84; 125; 127; 167; 181; 275;

287; 288; 292 standard kimenet megkettőzése → tee parancs standard out → standard kimenet stderr → standard hibacsatorna stdin → standard bemenet stdout → standard kimenet stty parancs 110; 208; 265; 270; 271; 275; 276; 278 su parancs 231 SunOS operációs rendszer 28; 65; 75; 76; 294 supervisor → rendszergazda superuser 34; 53; 64; 74; 91 SVID 19; 20 SVR4 20; 21; 52; 75; 161; 275; 278; 279; 294 symbolic link 65; 66; 69 System V 20; 21; 64; 76; 92; 105 szerszámosláda filozófia 39 szignál 250 szoftver megszakítás → szignál szoftver megszakításkezelés → trap utasítás szövegmezők szűrése → cut parancs szövegszerkesztő 122 szuperblokk 60 szűrő 56; 281; 285 tail parancs 172 tar parancs 27; 42; 43; 56; 60; 78; 81; 82; 84; 85; 90;

95; 96; 97; 101; 102; 105; 106; 109; 111; 113; 117; 118; 120; 122; 124; 169; 170; 171; 172; 175; 176; 186; 188; 191; 192; 195; 197; 199; 205; 206; 208; 211; 212; 218; 219; 221; 222;

223; 228; 229; 230; 231; 232; 238; 239; 240; 241; 243; 244; 252; 255; 257; 258; 260; 263; 264; 265; 266; 267; 280; 286; 289; 290; 291; 292

távoli parancsvégrehajtás → rsh parancs tee parancs 89; 92; 174; 175 telnet parancs 45; 212; 215 TERM változó 103; 104; 105; 227; 228; 242; 245;

246; 277 terminál azonosítása → tty parancs terminálbeállítások → stty parancs terminálbeállítások → tput parancs test parancs 139; 181; 182; 196; 199; 200; 201; 252 többfeladatos működés 24; 31; 37 többfelhasználós működés 18; 24; 25; 31; 32; 33 tput parancs 270; 277 tr parancs 132; 178; 179; 255 trap utasítás 110; 246; 250 tulajdonos módosítása → chown parancs UID → felhasználói azonosító új felhasználói csoportba lépés → newgrp parancs új katalógus létrehozása → mkdir parancs újsor karakter 135; 137; 139; 154; 157; 158; 162; 289 uniq parancs 171; 172 Unix-DOS fájlkonverzió → dos2unix parancs UnixDOS fájlkonverzió → unix2dos parancs Unix parancs 27; 28; 29; 33; 34; 37; 48; 49; 50; 51;

53; 54; 55; 56; 57; 58; 59; 60; 64; 70; 71; 72; 73; 74; 89; 93; 94; 107;

Page 351: unix kézkönyv

Tárgymutató

353

109; 116; 117; 126; 127; 128; 129; 130; 131; 132; 133; 134; 135; 137; 138; 139; 144; 145; 146; 147; 148; 150; 151; 152; 153; 154; 155; 156; 157; 158; 159; 160; 162; 163; 167; 168; 170; 174; 178; 179; 180; 181; 182; 183; 186; 188; 190; 191; 192; 193; 194; 220; 236; 245; 250; 251; 253; 266; 269; 270; 275; 277; 278; 279; 282; 284; 285; 286; 287; 288; 289; 291; 292; 293; 294

unix2dos parancs 294 user id 42 utility → segédprogram üzenetküldés terminálra → wall parancs üzenetküldés terminálra → write parancs változók örökítése → export utasítás vezérlőkarakter 272; 275 vi parancs, editor 24; 43; 55; 68; 77; 79; 80; 81; 82;

84; 86; 87; 88; 92; 97; 98; 99; 101; 110; 111; 112; 115; 116; 117; 125; 141; 142; 143; 144; 145; 146; 147; 148; 149; 151; 153; 154; 155; 158; 159; 160; 161; 162; 163; 164; 181; 190; 192; 195; 196; 197; 199; 201; 205; 206; 212; 215; 218; 224; 225; 228; 230; 235; 237; 239; 241; 243; 246; 250; 253; 254; 255; 257; 258; 260; 266; 267; 289; 293

vi üzemmódok beviteli mód 56; 115; 116; 144; 145; 150; 152; 162;

164 parancsmód 115 wall parancs 185 wc parancs 87; 88; 89; 100; 107; 109 whereis parancs 29 who parancs 71; 83; 84; 86; 87; 88; 89; 109; 194; 261;

263 working directory → munkakatalógus write parancs 56; 69; 119; 120; 133; 184; 185 X/Open 21 Xenix operációs rendszer 18; 19; 21