Zkouska 21.6 2011

Seznámení se základními principy operačního systému UNIX, převážně z uživatelského hlediska. Absolvent kurzu by měl být schopen napsat netriviální program v shellu.
Animaniak
Matfyz(ák|ačka) level I
Příspěvky: 11
Registrován: 21. 1. 2010 15:01
Typ studia: Informatika Bc.

Zkouska 21.6 2011

Příspěvek od Animaniak »

Dnesnim ukolem byl priklad nazvany oldtimer.
v podstate slo o skript ktery bude prepisovat cckovske zdrojaky tak aby vyhovovali starsi norme.
Na vstupu jsme dostali jako parametry nejake nazvy souboru .c a .h ,a nejake adresare,ktere jsme meli projit a najit v nich vsechny soubory *.c a *.h(pouze v adresari,nikoli v pdadresarich),a to byla podmozina souboru ktere jsme meli zpracovavat.proc podmnozina?no,pokud bude skript volan bez parametru,bude volan pro vsechny soubory aktualniho adresare.a dale,v souborech ke zpracovani se muze vyskytnout radka #include " * ",kde hvezdicka znaci nejakou relativni cestu k dalsimu souboru.ten zpracovat take.tady pozor na zacykleni,je treba osetrit aby se pridavaly jen soubory co jeste nebyly pridany.Jeste k tomu je dulezite poznamenat ze soubory se zpracovavaji pouze tehdy kdyz k nim mame pravo zapisu.
a ted jak se meni,jde jen o to zmenit volani a zadavani fci,fce vzdy vypada jako : jmeno index ( ) a pak je za ni ; nebo {,podle toho jestli se definuje nebo vola.
je tam 5 veci co mame zmenit,vzdy se meni jen obsah zavorek,a tudiz je jedno cokoliv pred ni.
(void); na ();
(void){ na (){
(promena i,promena2 i2...); na (promena,promena2...);
(promena;i); na (promena); nebo tak nejak
a konecne (promena i,promena2 i2...){ na (promena,promena2...) i,i2,... {
s tim ze promena muze obsahovat i mezery a hvezdicky a v podstate cokoliv krome carek zavorek a stredniku,a icka jsou z alfanumerickejch znaku(takze vzit retezec pred carkou nebo strednikem,a k predchozi mezere to je i)
a jeste ze ta zavorka muze byt pres vice radku
format si uchovat nemusime,ale musi to byt zpetne prevoditelne,takze nevypustit zadny znak
pak jeste nejake veci kolem,jako ze soubor ma mit stejne datum posledni upravy jako pred zpracovanim
tolik zadani.

ja jsem zacal zjistenim zda mam zadano 0 parametru,v tom pripade jsem si nechal vypsat obsah aktualniho adresary(ls *.c *.h) a rourou jsem je poslal cyklu ktery je readem po jednom cetl a pro kazdy zkusil zda k nemu mam pravo k psani,a pokud ani tak ho pomoci >> pripsal do souboru .Do souboru jsem si psal absolutni cesty,takze jsem mel promenou cesta=`pwd`a psal jsem je jako "$cesta$soubor"je to kvuli zjistovani zda tam ten soubor uz neni.pokud skript parametry mel,testoval pro soubory *.c|*.h pravo ke psani a pokud prosli,tak je taky napsal s absolutni cestou do souboru.pro adresare jsem delal to same jako pro . ve variante bez parametru. pravo k psani je kontroluje testem,konkretne [ -w soubor ],nekdo to zkousel findem,ale bylo mu vynadano ze find to nezjisti pro nas ale pro vlastnika,tudiz to s nim bud nejde a nebo velmi slozite.tak,mame absolutni cesty ziskane z parametru v souboru,do promene $radky si ulozime kolik jich v nem ted je,a pak na kazdej z nich spustime grep co hleda include neco,a pokud to najde,posle to do cyklu ktery vyrobi absolutni cestu k tomu inkludovanemu souboru,zjisti zda do nej lze psat,pak zjisti zda se v souboru s jmeny uz nevyskytuje (proto ty absolutni cesty,je z nich treba vypustit i redundantni kroky /./ a /*/../) a pokud ne tak ho pripise na konec.tady si nejsem jistej zda se ten soubor da cist nejak dynamicky,a proto jsem si po skonceni znova spocetl radky,a pokud jich bylo vic tak jsem cyklus spustil znovu,pouze na ty soubory co jsem pridal(cat soubory|tail -n+$radky)pote jsem mel vsechny cesty souboru urcenzch ke zpracovani ulozene v jednom souboru,a kazdou jsem editoval zvlast.mnoho lidi se na to snazilo jit pres awk,ale tam byl problem roztazeni zavorky pres vice radek.pokud se do RS nastavi vic znaku,prijdeme o ne,proto tam smi byt jen jeden.i forst rikal ze nejlepsi je strednik.ja to delal v edu,a prekvapilo me ze vysledny skript pro sed ma kolem 7 radek.pokud najdu radku kde je oteviraci zavorka,ale nikoliv zaviraci,spojim blok radek zacinajicich touto a koncici radkou se zaviraci zavorkou pomoci prikazu join.pak mam vsude jednoradkove zavorky,a zbyva je upravit.pro kazdy pripad se pouzije prikaz global,ktery hleda radky na nichz je zavorka a v ni void/zavorka a v ni carka koncici strednikem/zavorka a v ni carka koncici { nebo zavorka a v ni strednik.pozor na poradi tech zavorek,abz se vam nezpracovavaly dvakrat.pro kazdou stacil 1 prikaz substitute.nakonec to zapsat a skoncit ed(elal jsem to pomoci here documentu se \,aby do nej shell nelezl.
Omlouvam se za chyby textove a vyznamove,snad to nekomu pomuze...pripadne nejasnosti se pokusim objasnit.
jeste,dohromady 14 lidi,2*1 2*2 4*3 ustni nikdo
Palec

Re: Zkouska 21.6 2011

Příspěvek od Palec »

ja to delal v edu,a prekvapilo me ze vysledny skript pro sed ma kolem 7 radek.pokud najdu radku kde je oteviraci zavorka,ale nikoliv zaviraci,spojim blok radek zacinajicich touto a koncici radkou se zaviraci zavorkou pomoci prikazu join.
Tak sed nebo ed? Sed nemá příkaz join, takže asi ed.
Odpovědět

Zpět na „SWI095 Úvod do UNIXu“