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
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?
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!/
[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.
[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.
[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.
[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
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)
[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
— 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.
[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á.
[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á.
[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á.
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 ../..
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
[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
[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!)
cd; cd work
[23] Olvassuk ki a munkakatalógus tartalmát, de ne a "szabályos" ls paranccsal (lásd: od)
od -c .
[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.
[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?
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/.
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>
[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
[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>
[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>
[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>
[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>
[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!
[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.
[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)
— á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
[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 c2ahol 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
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;;
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.
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
[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
[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 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
[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á.
cd $home/tmp
uncompress -cv home.cpio | cpio -id
[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 -