prinyatuyu v nroff dlya nachala stranicy. |ta komanda nroff progonyaet stranicu i uvelichivaet na edinicu schetchik stranic. Vozmozhno, vy ne hotite menyat' nazhatie klavish control-L na eto znachenie, no vy vsegda mozhete ukazat' v komandnom fajle takie dejstviya, kakie vam nuzh- ny. PRIMERY 1. $ stripf module1.c | grep >"^\.bp$" | wc -l Pechataet chislo modulej-funkcij, soderzhashchihsya v fajle module1.c, putem poiska kazhdogo poyavleniya komand novoj stranicy programmy nroff i ih podscheta. My znaem, chto odna iz takih komand yavlyaetsya vyhodom dlya kazhdoj obnaruzhennoj funkcii. Dannuyu stroku mozhno vlozhit' v predlozhenie echo, kotoroe govorit "imeetsya X modulej v fajle $FILE". 2. $ for FILE in *.c ../*.c $HOME/src/*.c > do > stripf $FILE > done >> /tmp/func.hdrs Dannyj cikl for rasprostranyaetsya na vse fajly v tekushchem kataloge, kotorye okanchivayutsya na .c, vse fajly v roditel'skom kataloge s takim zhe suffiksom i vse fajly v podkataloge src moego home-kataloga s tem zhe suffiksom. Iz kazhdogo fajla izvlekaetsya dokumentaciya o funkciyah i nap- ravlyaetsya v standartnyj vyvod. Ves' cikl perenapravlen s pomoshch'yu >>, poetomu vyhod kazhdogo vyzova stripf DOBAVLYAETSYA k fajlu v /tmp. POYASNENIYA Vsya programma - eto odin bol'shoj cikl for v strokah 4-19. |tot cikl prisvaivaet peremennoj FILE kazhdoe imya, imeyushcheesya v komandnoj stroke. Dannyj komandnyj fajl ne imeet opcij i obrabotki oshibok. Komanda sed sistemy UNIX vyzyvaetsya dlya kazhdogo imeni fajla. Prog- ramma sed chitaet ves' vhod i vyvodit izmenennyj tekst v standartnyj vy- vod. Opciya -n ispol'zuetsya v sed dlya podavleniya vsego vyvoda, v proti- vopolozhnost' dejstviyu po umolchaniyu, kogda vse pechataetsya. My ispol'zuem etot flag po toj prichine, chto my hotim ukazat' programme sed, kogda pe- chatat' vyhod. Opciya -e primenyaetsya, chtoby soobshchit' programme sed, chto sleduyushchaya posledovatel'nost' teksta mezhdu odinarnymi kavychkami yavlyaetsya vyrazheniem, kotoroe nuzhno vychislit'. Napomnim, chto sed - potokovyj redaktor, kotoryj chitaet odnu stro- ku, sveryaet ee s vyrazheniyami, zatem chitaet sleduyushchuyu stroku i delaet vse snachala. Pervoe, chto my ishchem - simvol control-L, stoyashchij v stroke samostoyatel'no. Esli my ne nahodim ego, proveryaetsya sleduyushchaya stroka i tak dalee, poka ne budet obnaruzhen control-L. (Eshche raz napomnim, chto vmesto oboznacheniya ^L v kode dolzhen byt' vveden nastoyashchij control-L.) Kogda obnaruzhen control-L, on aktiviziruet vse vyrazhenie, zaklyu- chennoe v figurnye skobki. Pervym dejstviem yavlyaetsya podstanovka komandy nachala stranicy programmy nroff, kak opisano ranee. |ta podstanovka pe- chataetsya, chto yavlyaetsya samym pervym vyvodom. V stroke 9 ob®yavlena metka "loop". |to ne privodit ni k kakim dejstviyam, no ustanavlivaet tochku perehoda, kotoraya vposledstvii ispol'zuetsya. (Upravlyayushchie struktury programmy sed dovol'no primitivny, no oni pozvolyayut opisat' vypolnyaemuyu rabotu.) Stroka 8 ispol'zuet komandu n programmy sed, chtoby vyzvat' chtenie sleduyushchej stroki. My razobralis' s pervoj strokoj - strokoj, kotoraya soderzhit control-L - tak chto my mozhem ee otbrosit'. V sluchae vypolneniya cikla my vidim, chto sed prodvigaetsya po nashemu trebovaniyu, no ne prod- vigaetsya sam. Vspomnim model' dokumentacii, rassmotrennuyu ranee. |ta model' vklyuchaet dokumentiruyushchij zagolovok dlya fajla v celom, vypolnennyj v obychnom stile yazyka Si. Model' zavershaetsya simvolom control-L. |tot pervyj blok obrabatyvaetsya s pomoshch'yu stripc, kak opisano ranee. My ne hotim ispol'zovat' ego zdes' pri rabote so stripf. Poetomu my sejchas dolzhny spozicionirovat'sya posle fajlovogo dokumentiruyushchego zagolovka. Vsled za simvolom control-L imeetsya eshche odin nabor iz odnoj ili bolee strok kommentariya yazyka Si, kotorye opisyvayut funkciyu, sleduyushchuyu za nimi. Dalee idet samo imya funkcii, ob®yavlenie parametrov i otkryvayu- shchij simvol samoj funkcii, kotorym yavlyaetsya levaya figurnaya skobka (}). Stroka 11 ishchet etu figurnuyu skobku. Esli ona najdena, vypolnenie perehodit na metku exit (stroka 14). My mozhem polagat', chto my vse sde- lali, esli najdena levaya figurnaya skobka, tak kak etot simvol dolzhen poyavlyat'sya tol'ko v nachale funkciimodulya. Kogda my nahodim figurnuyu skobku, my uzhe napechatali k etomu momentu vsyu kommentiruyushchuyu informaciyu i zagolovok funkcii posredstvom stroki 12, kotoruyu my sejchas opishem. A chto esli figurnaya skobka poyavlyaetsya v pole kommentariya? Net problem, poskol'ku poisk figurnoj skobki privyazan k nachalu stroki s pomoshch'yu sim- vola ^. On proizvodit vyrazhenie, oznachayushchee "ot pervogo simvola v stro- ke". My tol'ko togda sopostavlyaem figurnuyu skobku etomu vyrazheniyu, kog- da ona vstrechaetsya v kachestve samogo pervogo simvola v stroke. Zatem stroka 12 predpolagaet, chto my eshche ne obnaruzhili figurnuyu skobku i poetomu my dolzhny napechatat' stroku. Operator p pechataet teku- shchuyu stroku, kotoruyu obrabatyvaet sed. |tot vyvod napravlyaetsya na ekran. Stroka 13 - bezuslovnyj perehod na metku loop. Otmetim, chto etot perehod tol'ko izmenil process vypolneniya i ne privel k chteniyu eshche od- noj vvodnoj zapisi. S etim my dolzhny byt' ostorozhny pri upravlenii pro- cessom vypolneniya v programme sed. My tol'ko chto napechatali tekushchuyu za- pis', poetomu teper' my dolzhny otbrosit' ee i poluchit' sleduyushchuyu za- pis', chto oznachaet vozvrat v stroku 9. |tot cikl pechati i chteniya sledu- yushchej zapisi prodolzhaetsya do obnaruzheniya figurnoj skobki, kotoraya pere- vodit vypolnenie na metku exit. Stroka 14 - eto metka exit. Kogda my popadaem na nee, my znaem, chto byl obnaruzhen control-L, napechatan kommentiruyushchij zagolovok, nape- chatany imya funkcii i ob®yavleniya ee parametrov i najdena figurnaya skob- ka. Zametim, chto figurnaya skobka eshche ne napechatana. Kogda my nahodim ee, my tol'ko delaem vetvlenie. Stroka 15 zavershaet vyvod, vstavlyaya nekotoryj tekst v vyvodnoj po- tok. My ne mozhem skazat' "pechatat' eto v bukvennom vide", poetomu pro- ishodit dvizhenie vpravo po tekstu, kak po komande echo. My dolzhny syg- rat' na pravilah, ustanovlennyh programmoj sed. Lyuboj vyvod dolzhen byt' porozhden obychnymi komandami v stile redaktora ed. Vstavka teksta s po- moshch'yu komandy "i" delaet nam eto. Otmetim, chto my takzhe vstavlyaem sim- vol vozvrata karetki (ili perevoda stroki, v zavisimosti ot vashej osve- domlennosti). On mozhet byt' opredelen simvolom obratnoj kosoj cherty (\). Obratnaya kosaya cherta ubiraet special'noe znachenie simvolov i pri ispol'zovanii v konce stroki, kak zdes', oznachaet, chto special'nyj sim- vol, vstavlennyj v vyrazhenie, yavlyaetsya vozvratom karetki. Vdobavok k vozvratu karetki, my vstavlyaem paru figurnyh skobok. |to oboznachaet ob®yavlenie nachala-konca funkcii, kotoruyu my obrabatyvaem. Poskol'ku my vstavlyaem tekst, my ne dolzhny govorit' programme sed, chto ego nuzhno pe- chatat'. Stroka 17 - bezuslovnyj perehod na sebya, ukazyvayushchij programme sed perehod na vershinu vsego obrabatyvaemogo vyrazheniya. Kogda eto proisho- dit, my zavershaem poisk eshche odnogo control-L i nachinaem ves' process snova. Takim obrazom, my mozhem obrabotat' vse funkcii iz odnogo fajla nezavisimo ot togo, skol'ko ih tam. Stroka 18 yavlyaetsya koncom sed-vyrazheniya i soderzhit takzhe imya faj- la, kotoroe dolzhno byt' peredano programme sed. |to yavlyaetsya chast'yu obychnogo sintaksisa, prinyatogo v sed, no vyglyadit neskol'ko neumestnym, tak kak ne vydeleno special'nym otstupom. Kogda vse fajly obrabotany, zavershaetsya vneshnij cikl i zakanchivaetsya rabota komandnogo fajla. 4.2.3. strips - iz komandnogo fajla Shell ------------------------------------------------------------ IMYA: strips ------------------------------------------------------------ strips Izvlekaet dokumentiruyushchij zagolovok komandnogo processora. FUNKCIYA Pechataet nachal'nye stroki kommentariya k komandnomu fajlu komandno- go processora, chto vyrazheno bukvoj "s" v imeni. Pervaya stroka ignoriru- etsya dlya sovmestimosti s komandnym processorom yazyka Si. FORMAT strips fajl [...] PRIMER VYZOVA strips *.sh Izvlekaet kommentarii iz vseh komandnyh fajlov v tekushchem kataloge. ISHODNYJ KOD DLYA strips 1 : 2 # @(#) strips v1.0 Strip shell comment header Author: Russ Sage 4 for FILE in $@ 5 do 6 cat $FILE | (read LINE; echo $LINE 7 while read LINE 8 do 9 if [ "`echo $LINE|cut -c1`" = "#" ] 10 then echo "$LINE" 11 else exit 12 fi 13 done) 14 done PEREMENNYE SREDY FILE Hranit kazhdoe imya fajla, poluchennoe iz komandnoj stroki. LINE Hranit kazhduyu stroku vvodnogo teksta, poluchennuyu iz chitaemogo fajla. OPISANIE ZACHEM NAM NUZHEN strips? Tak zhe kak nam nuzhny sredstva obrabotki dokumentacii dlya fajlov s ishodnym kodom na Si, nam nuzhny i analogichnye sredstva dlya komandnyh fajlov komandnogo processora. Raznica mezhdu izvlecheniem kommentariev iz koda na yazyke Si i ih izvlecheniem iz koda komandnyh fajlov komandnogo processora - v sposobe razgranicheniya kommentariev v ishodnom fajle. Ishodnyj fajl na Si ispol'zuet paru /* */, a komandnye fajly komandnogo processora primenyayut #, chtoby vydelit' ostatok stroki kak kommentarij. Obrabotka dokumentacii oblegchaetsya, kogda komandnye fajly sleduyut nekotoroj forme standartizovannoj dokumentacii. V dejstvitel'nosti net formal'nogo standarta, no naibolee blizkij standart prihodit so stranic rukovodstv po samoj sisteme UNIX. Standartnymi polyami yavlyayutsya imya ko- mandnogo fajla, sposob ego vyzova, chto on delaet i, vozmozhno, nekotorye pometki o tom, kak on rabotaet, ssylki na drugie mesta dlya poiska in- formacii i svedeniya o tom, kakie fajly ispol'zuet dannyj komandnyj fajl. Primer formata vyglyadit tak: : # IMYA # strips Izvlekaet polya shell-kommentariev # # FORMAT VYZOVA # strips fajl [...] # # AVTOR # Russ Sage mm/dd/yy # # OPISANIE # Dannyj komandnyj fajl izvlekaet kommentiruyushchie # zagolovki iz komandnyh fajlov interpretatora shell. # # SM. TAKZHE # sh(1), cat(1) Otmetim, chto v pervoj stroke imeetsya operator :, kotoryj yavlyaetsya dlya komandnogo processora nulevym operatorom. On nichego ne delaet, no vsegda vozvrashchaet uspeshnyj status vyhoda. On nahoditsya v otdel'noj stroke, poskol'ku eto oboznachaet komandnyj fajl dlya Bourne shell. Esli vy zapuskaete /bin/csh vmesto /bin/sh, komandnye fajly mogut vyzvat' putanicu. C Shell ishchet simvol # v pervoj kolonke pervoj stroki. Esli on tam est', komandnyj processor schitaet etot fajl komandnym fajlom in- terpretatora csh. CHtoby ukazat' interpretatoru csh, chto komandnyj fajl prednaznachen dlya interpretatora Bourne shell, my mozhem ostavit' etu stroku pustoj (chto budet ne slishkom horosho pechatat'sya i podlezhit udale- niyu) ili pomestit' operator, kotoryj soobshchaet interpretatoru C Shell, chto eto komandnyj fajl dlya Bourne shell, no nichego ne delaet pod uprav- leniem Bourne shell. CHTO DELAET strips? Strips chitaet komandnyj fajl i pechataet vse kommentarii s nachala fajla, kotorye yavlyayutsya nepreryvnymi (t.e. pechataet, poka ne dostignet stroki, ne yavlyayushchejsya kommentariem). Pervaya stroka ignoriruetsya, no pe- chataetsya. Kogda stroka ne imeet simvola # v pervoj simvol'noj pozicii, strips prekrashchaet chtenie etogo fajla. Komandnyj fajl dolzhen imet' strukturu kommentariya, analogichnuyu strukture, pokazannoj v nashem predydushchem primere. Simvoly # dolzhny byt' v pervoj pozicii, i kazhdaya stroka dolzhna imet' simvol #. Esli u vas est' pustaya stroka gde-nibud' v nachal'nom bloke kommentariev, strips pechataet tol'ko pervuyu chast' bloka. PRIMERY 1. $ strips `kind /bin /usr/bin` Bloki kommentariev izvlekayutsya iz tekstovyh fajlov, razmeshchennyh v katalogah /bin i /usr/bin. 2. $ find / -name "*.sh" -print | while read FILE > do > strips $FILE > /tmp/doc/$FILE > done Find porozhdaet spisok vseh imen fajlov, kotoryj popadaet v strips. Vyhod strips napravlyaetsya v katalog dokumentacii v /tmp. Okonchatel'nyj vyhod popadaet v fajl s tochno takim zhe imenem, kak ishodnyj fajl, tol'- ko vyhod pomeshchaetsya v /tmp, poetomu nikakih sluchajnyh udalenij ne pro- ishodit. POYASNENIYA Stroki 4 i 14 okajmlyayut vneshnij cikl, kotoryj podaet imena fajlov dannomu komandnomu fajlu. Obrabotki ili proverki oshibok net. Poka v ko- mandnoj stroke est' fajly, cikl prodolzhaetsya. Vy mozhete, konechno, pro- verit' nalichie argumentov, pravil'nost' i sushchestvovanie fajlov. Dlya etogo, my dumaem, vy videli dostatochno primerov proverki oshibok, chtoby dobavit' ih, kuda vam nuzhno. Poetomu my inogda opuskaem takie fragmenty v nashem kode, chtoby sekonomit' mesto i vydelit' glavnuyu funkciyu. Stroka 6 primenyaet komandu cat k fajlu, kotoryj sejchas obrabatyva- etsya. Vyhod napravlyaetsya v konvejer, chtoby ego prochital drugoj shell. Novyj shell poluchaet dlinnuyu komandnuyu stroku (oboznachennuyu skobkami v strokah 6 i 13). Pervaya komanda read chitaet samuyu pervuyu stroku. Poskol'ku my ne sobiraemsya proveryat' etu stroku, my otobrazhaem ee, a zatem opuskaemsya v cikl posledovatel'nogo chteniya. Predpolagaetsya, chto pervaya stroka nachinaetsya s dvoetochiya, no esli ona nachinaetsya s simvola #, ona vse ravno pechataetsya, tak chto vy ne budete teryat' tekst. Stroki 7-13 yavlyayutsya vnutrennim ciklom while, chitayushchim stroki teksta so standartnogo vvoda, kotoryj byl vyhodom komandy cat. Kogda tekst zakanchivaetsya, prekrashchaetsya i cikl while. Stroki 9-12 - eto stroki prinyatiya resheniya. Snachala my otobrazhaem tekushchuyu vvodnuyu stroku i peredaem ee po konvejeru komande cut. Vyreza- etsya pervyj simvol, zatem komanda sravneniya proveryaet, sovpadaet li on s simvolom kommentariya. Esli da, stroka otobrazhaetsya na standartnyj vy- vod. Esli eto ne simvol kommentariya, to nuzhno dostich' konca bloka kom- mentariev, poetomu proishodit vyhod iz vnutrennego cikla. Upravlenie vozvrashchaetsya vo vneshnij cikl (for), kotoryj startuet i beret sleduyushchee imya fajla. Kogda vse fajly obrabotany, strips zavershaetsya. 4.3. ctags - sozdanie fajla priznakov ishodnogo koda proekta ------------------------------------------------------------ IMYA: ctags ------------------------------------------------------------ ctags Delaet fajl priznakov ishodnogo koda dlya prostoty dostupa s pomoshch'yu utility vi. FORMAT ctags [fajl ...] PRIMER VYZOVA ctags proj*.c Delaet fajl priznakov dlya vsego ishodnogo koda proekta. ISHODNYJ KOD DLYA ctags 1 : 2 # @(#) ctags v1.0 Create a C source code tag file Author: Russ Sage 4 awk -F'(' '/^[a-zA-Z_][a-zA-Z0-9_]*\(/ { 5 printf ("%s\t%s\t/^%s$/\n", $1, FILENAME, $0) }' $@ | sort -u +0 -1 PEREMENNAYA SREDY FILENAME awk Peremennaya, soderzhashchaya imya fajla. OPISANIE ZACHEM NAM NUZHEN ctags? UNIX sozdan kak sreda dlya razrabotki programmnogo obespecheniya. Ona podderzhivaet i pooshchryaet modul'nost' ishodnogo koda programmy. Modul'- nost' - eto koncepciya razbieniya proekta na otdel'nye fajly, prevrashcheniya idej v podprogrammy i kompilyacii otdel'nyh fajlov s ishodnym kodom v peremeshchaemye moduli dlya posleduyushchej ih sborki v ispolnyaemyj modul'. Takaya filosofiya razrabotki programmnogo obespecheniya mozhet, odnako, porodit' nekotorye problemy. Glavnaya problema - popytka poluchit' neko- torogo roda scepku iz vseh malen'kih kuskov golovolomki. Delayutsya vyzo- vy podprogramm, kotorye nahodyatsya v drugih fajlah, vozmozhno dazhe v dru- gih katalogah. Nuzhen instrument, pozvolyayushchij nam, lyudyam, posmotret' na programmnoe obespechenie chelovecheskim vzglyadom, t.e. soderzhatel'no, a ne s tochki zreniya fizicheskogo razmeshcheniya. |tot podhod chem-to analogichen chteniyu knigi v sravnenii s chteniem komp'yuternoj raspechatki. Raspechatka zastavlyaet vas delat' posledovatel'nyj prosmotr, a kniga dopuskaet prya- moj dostup (i obychno predostavlyaet oglavlenie i predmetnyj ukazatel' dlya poiska specificheskih punktov). Ctags preodolevaet etot razryv, sozdavaya fajl special'nogo forma- ta, kotoryj raspoznayut redaktory vi i ex. |tot fajl soderzhit "prizna- ki", kotorye mogut byt' ispol'zovany pri rabote s redaktorom dlya obespecheniya avtomaticheskogo dostupa k lyuboj nuzhnoj funkcii, ne trebuyu- shchego ot vas znanij o tom, v kakom fajle nahoditsya funkciya. Fakticheski, ctags predostavlyaet vam predmetnyj ukazatel' dlya grup- py fajlov s ishodnym kodom na yazyke Si. Kogda vy ob®edinyaete ego s re- daktorom, vy mozhete bystro najti lyubuyu funkciyu po izvestnomu vam imeni i posmotret' telo funkcii. |to znachit takzhe, chto vy mozhete legko kopi- rovat' i vstavlyat' funkcii v lyuboj ishodnyj fajl, s kotorym vy sejchas rabotaete. Esli redaktor ne imel vozmozhnosti raboty s priznakami ili my ne postroili instrumental'noe sredstvo, ispol'zuyushchee takoe preimushchestvo, to my dolzhny zapuskat' grep dlya imeni funkcii na nabore ishodnyh fajlov na Si (v nadezhde, chto u nas est' podhodyashchie fajly!), otmechat', kakoj fajl imeet trebuemuyu funkciyu, vhodit' v etot fajl redaktorom (vruchnuyu vvodya vse simvoly imeni fajla), a zatem nabirat' simvoly shablona po- iska. |to bol'shaya rabota, kotoraya mozhet zanyat' mnogo vremeni. Blagodarya ispol'zovaniyu vozmozhnosti raboty s priznakami, dlya fajla priznakov, iz- vlechennyh iz ishodnogo koda, vsya eta ruchnaya rabota sokrashchaetsya. |to sochetanie vozmozhnostej illyustriruet to, chemu ne chasto prida- etsya znachenie: vladel'cy UNIX vsegda nastorozhenno otnosyatsya k vozmozh- nosti ispol'zovat' preimushchestva mnogochislennyh sredstv, uzhe imeyushchihsya v takih programmah, kak vi ili ex. Zachastuyu ot 90 do 95 procentov neobho- dimyh vam vozmozhnostej uzhe imeyutsya, ozhidaya otnositel'no prostogo ko- mandnogo fajla interpretatora shell, svyazyvayushchego ih vmeste v moshchnyj novyj instrument. Ctags uzhe sushchestvuet v vide ispolnyaemogo modulya v sisteme Berkely (BSD) i v nyneshnej AT&T System V. On proishodit iz sistemy Berkely, no podderzhivaetsya teper' v System V. |to illyustraciya vzaimodejstviya mezhdu etimi dvumya istochnikami v mire UNIX, poskol'ku oni vzaimstvuyut poleznye idei drug u druga. Dannoe konkretnoe voploshchenie ctags yavlyaetsya komand- nym fajlom utility awk, imitiruyushchim ispolnyaemuyu programmu iz sistemy Berkely, a eto znachit, chto pol'zovateli sistem XENIX i predydushchih versij AT&T mogut teper' izvlech' pol'zu ot primeneniya ctags. Eshche odno preimushchestvo versii v vide komandnogo fajla v tom, chto ego mozhno legko modificirovat', chtoby obrabatyvat' drugie osobennosti yazyka Si. Takoe vy ne mozhete delat' s ispolnyaemym modulem, esli tol'ko u vas net doro- gostoyashchej licenzii na ishodnyj kod. CHTO DELAET ctags? Ctags prosmatrivaet fajly s ishodnym kodom na Si, peredannye v ko- mandnoj stroke, i pechataet spisok imen funkcij v kazhdom ishodnom fajle. Imena funkcij imeyut special'nyj sintaksis i dolzhny byt' imenno v takom formate, inache awk ne raspoznaet ih kak takovye. |ti pravila zaklyucha- yutsya v tom, chto imya funkcii dolzhno nahodit'sya v nachale stroki, sostoyat' iz razreshennyh simvolov i za nim dolzhna sledovat' levaya skobka. Probely v imeni funkcii ne dopuskayutsya. Vot primer modulya programmy na Si, po- davaemogo na rassmotrenie komandnomu fajlu ctags: main() { } func1(arg1,arg2) int arg1,arg2; { } func2(arg1,arg2)int arg1,arg2; { } Rezul'tat raboty ctags napravlyaetsya v standartnyj vyvod (na ek- ran), poetomu on dolzhen byt' perenapravlen, chtoby popast' v fajl. Vho- dom dlya ctags yavlyaetsya lyuboe chislo imen fajlov. Napomnim, chto esli na vhode imeetsya neskol'ko fajlov, to vyhod predstavlyaet soboj odin nepre- ryvnyj potok dannyh, popadayushchij v odin fajl. Esli vam nuzhen vyvodnoj fajl dlya kazhdogo vhodnogo fajla, to dlya upravleniya ctags mozhno prime- nit' takoj komandnyj fajl s ciklom: for F in *.c do ctags $F > $F.tags done Vyhod ctags sostoit iz treh polej v takom formate: priznak imya_fajla shablon_poiska Real'nyj vyhod dlya primera programmy na Si, privedennogo vyshe, byl by takim: main /usr/russ/src/program.c /^main()$/ func1 /usr/russ/src/program.c /^func1(arg1,arg2)$/ func2 /usr/russ/src/program.c /^func2(arg1,arg2)$/ Pervoe pole yavlyaetsya imenem priznaka (kotoroe sovpadaet s imenem funkcii). Vtoroe pole - marshrutnoe imya fajla, soderzhashchego dannuyu funk- ciyu. Tret'e pole - shablon poiska, ispol'zuemyj priznakovymi sredstvami redaktora dlya dostupa k funkcii vnutri fajla (bolee podrobno ob etom - pozzhe). Predpolozhim, vy mozhete sgenerirovat' pravil'nyj fajl priznakov. Kak soglasovat' fajl priznakov s redaktorami takim obrazom, chtoby vy mogli najti interesuyushchuyu vas funkciyu? Redaktor vi predostavlyaet mnogo putej dlya etogo. Pervyj sposob - pomestit' imya ispol'zuemogo fajla priznakov v fajl .exrc. (Fajl .exrc yavlyaetsya analogom fajla .profile dlya redaktora ex i rabotaet takzhe s redaktorom vi, chto ne udivitel'no, tak kak vi postroen na ex. Poskol'ku vi - naibolee populyarnyj redaktor sistemy UNIX, my primenyaem ego zdes' dlya nashih primerov.) Vy mozhete imet' fajl .exrc, kotoryj vyglyadit primerno tak: set tags=/usr/russ/mytags Vposledstvii, kogda vy obrashchaetes' k nekotoromu priznaku, ispol'- zuetsya dannyj fajl priznakov. Drugoj sposob - ustanovit' fajl priznakov posle togo, kak vy voshli v redaktor. CHtoby posmotret', kakim yavlyaetsya vash fajl priznakov po umolchaniyu, vvedite, nahodyas' v vi, sleduyushchee: :set tags |ta komanda pechataet fajl priznakov, o kotorom ona znaet. Dlya iz- meneniya opredelennogo v nastoyashchij moment fajla priznakov, ispol'zujte sintaksis, kotoryj byl v primere fajla .exrc: :set tags=/usr/russ/mytags Teper', kogda redaktor znaet, v kakom fajle iskat' priznaki, k ko- torym vy obrashchaetes', davajte rassmotrim, kak obrashchat'sya k priznaku (t.e. k imeni funkcii). Pervyj sposob - ob®yavit' ego v komandnoj stroke pri vyzove redaktora. Naprimer: $ vi -t tag Esli vy uzhe nahodites' v redaktore vi, mozhete primenit' takuyu ko- mandu dlya poiska priznaka: :ta tag Dvoetochie oznachaet, chto my napravlyaemsya v ex, chtoby vypolnit' etot poisk. My prosim ex najti ukazannuyu stroku kak priznak, kotoryj razme- shchaetsya v tekushchem fajle priznakov. Kogda etot priznak najden v fajle priznakov, redaktor vi redaktiruet fajl s sootvetstvuyushchim imenem, koto- roe on beret iz polya 2. |to analogichno komande ":e imya_fajla". Kogda novyj fajl vnesen v bufer redaktora, poslednee pole fajla priznakov ispol'zuetsya v kachestve stroki shablona poiska. Sintaksis tochno takoj zhe, kak esli by vy nabirali ego vruchnuyu. Kursor peremeshchaetsya v poziciyu v fajle, kotoraya sootvetstvuet stroke poiska, pri etom vy popadaete na interesuyushchuyu vas funkciyu. VZAIMOSVYAZX MEZHDU ex I vi Neskol'ko otklonyayas' ot temy, rassmotrim dva fajla: /bin/ ex i /bin/vi. Nebol'shoe issledovanie obnaruzhivaet, chto na samom dele eto odin i tot zhe fajl. My mozhem proverit' eto, posmotrev na ih indeksnye opisateli fajlov. Vvedite takuyu komandu: $ ls -li `path ex vi` Vyhod pokazyvaet, chto dva chisla v pervoj kolonke odinakovy. 510 -rwx--x--t 5 bin bin 121412 Sep 19 1985 /bin/ex 510 -rwx--x--t 5 bin bin 121412 Sep 19 1985 /bin/vi |to chislo i est' indeksnyj opisatel' fajla (inode). Poskol'ku oba fajla yavlyayutsya odnim i tem zhe, vyzov lyubogo iz nih zapuskaet odin i tot zhe ispolnyaemyj modul'. Kakim obrazom on znaet, kak vy ego vyzvali? Programma smotrit na stroku argv[0] i vidit, kakoe imya vy ispol'zovali dlya vyzova fajla. Zatem redaktor ustanavlivaet svoj interfejs v soot- vetstvii s tem, kak vy ego vyzvali. Obratite vnimanie, chto eta programma imeet pyat' svyazej. Kak nam najti vse drugie imena, kotorymi mozhno vyzvat' vi i ex? My mozhem ispol'zovat' komandu sistemy UNIX ncheck. |ta komanda vosprinimaet in- deksnyj opisatel' fajla i pechataet vse fajly, imeyushchie takoj opisatel' fajla . Primery takih komand: $ ncheck -i 510 /dev/root $ ncheck -i 510 Pervyj sintaksis ukazyvaet komande ncheck iskat' fajly s inode, ravnym 510, tol'ko v kornevoj fajlovoj sisteme. Ncheck ogranichena po- iskom v odnoj fajlovoj sisteme. |to podkreplyaet tot fakt, chto fajly ne mogut byt' privyazany k razlichnym fajlovym sistemam, poskol'ku kazhdaya fajlovaya sistema nachinaetsya s inode 2 i posledovatel'no narashchivaetsya. Kazhdaya fajlovaya sistema imeet inode 510, kotoryj unikalen dlya kazhdoj fajlovoj sistemy. Vyhod predydushchej komandy vyglyadit tak: dev/root: 510 /bin/edit 510 /bin/ex 510 /bin/vedit 510 /bin/vi 510 /bin/view Esli fajlovaya sistema ne ukazana, kak vo vtorom primere, vypolnya- etsya poisk po vsem fajlovym sistemam, smontirovannym v nastoyashchee vremya. |to ne slishkom horosho dlya nas, poskol'ku pyat' svyazej vi dolzhny naho- dit'sya v odnoj i toj zhe fajlovoj sisteme. V protivnom sluchae fajly byli by svyazany poperek granic fajlovyh sistem. My uzhe mozhem skazat', chto nikakih fajlov redaktora net v kataloge /usr, razmeshchennom vo vtorom razdele diska ot kornevoj fajlovoj sistemy. PRIMERY 1. $ ctags *.c Generiruet fajl priznakov dlya vseh fajlov s ishodnym kodom na Si v tekushchem kataloge. Vyhod napravlyaetsya na ekran v otsortirovannom poryadke dlya kazhdogo fajla. Poryadok fajlov alfavitnyj, tak kak ukazano rasshire- nie fajla. Konechno, v bol'shinstve sluchaev vy zahotite perenapravit' vy- hod ctags v fajl. 2. $ ctags `Find /usr/src -name "*.c" -print` |tot sintaksis ispol'zuet komandnuyu podstanovku, chtoby najti vse imena fajlov, okanchivayushchiesya na .c i pomestit' ih v komandnuyu stroku. Problema v tom, chto esli najdeno slishkom mnogo fajlov, komandnaya stroka ctags mozhet perepolnit'sya i isportit' vsyu komandu. V zavisimosti ot ser'eznosti perepolneniya, ona mozhet isportit' i ves' vash process shell. 3. $ find /usr/src -name "*.c" -exec ctags {} \; > tags Nahodit vse ishodnye fajly na Si v segmente dereva /usr/src. Dlya kazhdogo podhodyashchego fajla zapuskaet programmu ctags na etom fajle. Ispol'zovanie takoj formy zapisi predotvrashchaet porchu vashej komandy (o kotoroj tol'ko chto shla rech'), a takzhe zapuskaet ctags dlya kazhdogo imeni fajla. Ves' vyhod pomeshchaetsya v fajl tags dlya posleduyushchego ispol'zova- niya. 4. $ find /usr/src -type f -print | sort | > while read FILE > do > ctags $FILE > done >> tags Ispol'zuya preimushchestvo mnozhestvennyh katalogov, nahodit i sortiru- et vse fajly iz kataloga /usr/src i pechataet ih marshrutnye imena v standartnyj vyvod. Zatem oni sortiruyutsya i postupayut po konvejeru v cikl while. Cikl while ispol'zuetsya dlya obsluzhivaniya skol' ugodno bol'- shogo chisla fajlov bez perepolneniya buferov. Vyhod cikla while dobavlya- etsya k odnomu fajlu - tags. |tot cikl gromozdkij i medlennyj, no on vy- polnyaet svoyu rabotu. 5. $ find /usr/src -print | ctags |to nepravil'nyj sposob ispol'zovaniya ctags. Vyhodom komandy find yavlyayutsya marshrutnye imena. Ctags chitaet standartnyj vvod, poskol'ku v komandnoj stroke net fajlov. Poluchaetsya, chto dannye, kotorye chitaet awk, yavlyayutsya marshrutnymi imenami ot find, kotorye ne imeyut korrektnyh polej dlya sootvetstviya shablonam funkcij. Nikakogo sopostavleniya ne pro- ishodit. Analogichnuyu problemu mogla by vyzvat' takaya komandnaya stroka: find /usr -print | wc -l Vy mogli by interpretirovat' eto tak: "poschitat', skol'ko strok imeetsya vo vseh fajlah kataloga /usr". No v dejstvitel'nosti zdes' ska- zano: "skol'ko imen fajlov imeetsya v drevovidnoj strukture /usr". Dlya podscheta obshchego kolichestva strok v etih fajlah nuzhen takoj sintaksis: find /usr -exec cat {} \; | wc -l kotoryj glasit: "najti vse fajly v /usr, raspechatat' kazhdyj iz nih, zatem poschitat', skol'ko strok v nih imeetsya". CHtoby tak zhe postu- pit' s ctags, nuzhen takoj sintaksis: find /usr/src -name "*.c" -exec cat {} \; | ctags V otlichie ot rezul'tata, kotoryj my poluchili by v predydushchih pri- merah: func1 /usr/russ/src/program.c /^func1(arg1,arg2)$/ func2 /usr/russ/src/program.c /^func2(arg1,arg2)$/ teper' vyhod budet vyglyadet' tak: func1 - /^func1(arg1,arg2)$/ func2 - /^func2(arg1,arg2)$/ POYASNENIYA Simvoly "-" vmesto imeni fajla poyavlyayutsya iz-za togo, chto ctags chitaet iz standartnogo vvoda. Awk avtomaticheski prisvaivaet svoej vnut- rennej peremennoj FILENAME znachenie "-", tak kak znaet, chto v komandnoj stroke ne bylo fajlov. Ves' komandnyj fajl est' programma awk. Vhodom dlya komandnogo faj- la utility awk yavlyaetsya $@, chto predstavlyaet vse pozicionnye parametry. Kazhdyj parametr schitaetsya imenem ishodnogo fajla na Si. Esli nikakie fajly ne peredayutsya v komandnoj stroke, awk ishchet dannye v standartnom vhodnom potoke, no eto sozdaet nekorrektnyj vyhod, tak kak peremennaya FILENAME v awk imeet po umolchaniyu znachenie "-". Poskol'ku awk trebuet imena fajlov, my dolzhny vyzyvat' ctags s imenami fajlov, a ne pereda- vat' emu dannye po konvejeru cherez standartnyj vvod, kak pokazano v predydushchem primere. Awk chitaet kazhdyj raz odnu stroku iz fajla dannyh i sveryaet ee s shablonom, pytayas' ustanovit' sootvetstvie. Dlya kazhdoj stroki, soot- vetstvuyushchej shablonu, awk vypolnyaet zadannuyu programmu. Pervoe, chto de- laet ctags,- izmenyaet podrazumevaemyj razdelitel' polej utility awk s probela na levuyu skobku. Blagodarya ispol'zovaniyu etogo simvola v ka- chestve razdelitelya polej, stroka opredeleniya funkcii razbivaetsya na dva polya: imya funkcii i ostatok stroki. SHablon poiska utility awk sootvetstvuet sintaksisu imeni Si-funk- cii. Ono mozhet nachinat'sya s simvolov a-z, A-Z ili simvola podcherkiva- niya. Dalee v imeni mogut byt' lyubye simvoly iz nabora a-z, A-Z, 0-9 i _. Mezhdu imenem i skobkoj nel'zya ispol'zovat' probely. Poisk nachinaetsya ot nachala stroki (^), za kotorym sleduet posledovatel'nost' dopustimyh simvolov (a-z, A-Z, 0-9), a zatem levaya skobka. Kogda stroka sootvetstvuet dannomu shablonu, generiruetsya vyhod s pomoshch'yu operatora printf. Pervoe pole - stroka, predstavlennaya obozna- cheniem $1. V dannom sluchae $1 - eto tol'ko imya funkcii, isklyuchaya levuyu skobku. Pechataetsya simvol tabulyacii, zatem sleduyushchaya stroka, kotoraya yavlyaetsya peremennoj FILENAME iz utility awk. |ta peremennaya dolzhna byt' poluchena iz komandnoj stroki, inache awk ne budet znat' imya fajla, v ko- torom razmeshchena dannaya funkciya, i fajl priznakov poteryaet informaciyu, neobhodimuyu dlya dostupa k fajlu, soderzhashchemu funkciyu. Pechataetsya eshche odna tabulyaciya, zatem stroka poiska. Strokoj poiska yavlyaetsya $0, chto predstavlyaet vsyu stroku, s kotoroj rabotaet awk. Stroke predshestvuet simvol ^, a za strokoj sleduet simvol $. Vyhod propuskaetsya po konvejeru cherez sort s toj cel'yu, chtoby vse priznaki shli v otsortirovannom poryadke. Opcii sortirovki ukazyvayut uti- lite sort proveryat' tol'ko pervoe pole i pechatat' tol'ko odno poyavlenie stroki, esli imeetsya neskol'ko zapisej. MODIFIKACII DLYA ctags Teper', kogda my znakomy s obshchim formatom redaktiruemogo fajla priznakov, mozhem li my primenit' ego dlya drugih poleznyh celej? My zna- em, chto my mozhem identificirovat' regulyarnye struktury v programmah na Sii sozdat' priznaki, s pomoshch'yu kotoryh mozhno poluchit' dostup k etim strukturam v redaktore. V programmah na Si imeyutsya ne tol'ko imena funkcij, no i drugie interesnye konstrukcii, naprimer imena struktur. Ih mozhno obsluzhivat' s pomoshch'yu modificirovannoj versii ctags. Edinstvennoe, chto nam nuzhno znat',- eto oficial'nyj sintaksis struktury dannyh. Struktura dannyh, kotoraya nas by zainteresovala, chasto imeet takoj format: struct name { int val1; char val2; }; Vse, chto my dolzhny sdelat',- eto zastavit' awk iskat' vse poyavle- niya opredeleniya struktury. Zatem my mozhem postroit' fajl priznakov, v kotorom priznakom yavlyaetsya imya struktury. |tot fajl, vidimo, budet ta- kim zhe, kak i prezhde, a stroka poiska budet obnaruzhivat' opredelenie struktury, a ne imya funkcii. Fakticheski, kombinaciya utility awk, priz- nakov i redaktora mozhet byt' ispol'zovana dlya lyubogo vida informacii, kotoruyu vy mozhete zahotet' hranit' v fajle special'nogo formata, napri- mer dlya adresov, zametok, bibliograficheskih ssylok i t.d. Vam prosto nuzhno podobrat' sootvetstvuyushchie razdeliteli i pravil'no ih ispol'zo- vat'. My nadeemsya, chto oblegchili soprovozhdenie vashih programm i predlo- zhili vam idei dlya drugih sposobov avtomaticheskoj obrabotki dokumenta- cii. Vy mozhete bez osobogo truda uchrezhdat' i podderzhivat' lokal'nye soglasheniya o dokumentacii s pomoshch'yu komandnyh fajlov, analogichnyh predstavlennym zdes'. Primerom proekta, za kotoryj vy mozhete vzyat'sya, yavlyaetsya soglasovanie nashih programm izvlecheniya informacii (stripf, stripc, strips) i drugih programm, kotorye vy pishete, takim obrazom, chtoby oni mogli chitat' fajl-formirovatel' (makefile, sm. Make(1)) i vy- davat' polnuyu dokumentaciyu po vsem ishodnym fajlam, uchastvuyushchim v dan- nom proekte.  * GLAVA 5. UPRAVLENIE LICHNOJ INFORMACIEJ I: *  UPRAVLENIE VREMENEM I DELOPROIZVODSTVOM UPRAVLENIE VREMENEM at vypolnenie zadach v ukazannoe vremya b porozhdennyj shell fonovyh zadach greet svoevremennoe privetstvie s terminala lastlog soobshchenie vremeni poslednej registracii timelog uchet i statistika seansov raboty today pechat' kalendarya s otmechennoj tekushchej datoj UPRAVLENIE DELOPROIZVODSTVOM jargon generator tehnicheskih terminov phone baza dannyh s telefonnymi nomerami office deloproizvoditel' UPRAVLENIE LICHNOJ INFORMACIEJ I: UPRAVLENIE VREMENEM I DELOPROIZVODSTVOM VVEDENIE My uzhe mnogoe znaem o fajlah i o tom, kak upravlyat' fajlovoj strukturoj. Pora rassmotret', kak my mozhem ispol'zovat' sistemu UNIX dlya upravleniya mnozhestvom zadach, kotorye sostavlyayut nash rabochij den' i derzhat nas v kurse togo, chto delayut drugie pol'zovateli. Termin "up- ravlenie lichnoj informaciej" (personal management) podrazumevaet, chto vy hotite sozdat' svoyu sobstvennuyu PERSONALXNUYU rabochuyu sredu i instrumental'nye sredstva. My predlagaem vam paket programm, kotorye vy mozhete prisposobit' k vashim trebovaniyam. Fakticheski my v etoj i sleduyushchej glave predstavlyaem chetyre otdel'nyh nabora programm, kazhdyj iz kotoryh posvyashchen opredelennomu aspektu upravleniya lichnoj informaci- ej. Sredstva upravleniya vremenem pomogayut nam splanirovat' vypolnenie zadach komp'yuterom, a takzhe kontrolirovat' nashe lichnoe vremya. Upravle- nie deloproizvodstvom imeet delo s hraneniem i izvlecheniem informacii, a takzhe s organizaciej dostupa k razlichnym funkciyam sistemy UNIX posredstvom prostogo v ispol'zovanii interfejsa v vide menyu. Dlya kazhdoj iz etih oblastej deyatel'nosti my daem ee obzor, a za- tem predstavlyaem sootvetstvuyushchuyu gruppu sredstv. UPRAVLENIE VREMENEM Poskol'ku sistema UNIX imeet vstroennye funkcii podderzhki vremeni i chasy, ona mozhet sledit' za vremenem. Ob®edinenie funkcij podderzhki vremeni s vozmozhnost'yu avtomaticheskogo zapuska gruppy komand oznachaet, chto my mozhem nastroit' ih tak, chtoby komp'yuter vypolnyal mnogie nashi rutinnye raboty, svyazannye so vremenem. My takzhe mozhem ispol'zovat' komp'yuter dlya otslezhivaniya nashego sobstvennogo vremeni. V dannom razdele predstavleny instrumental'nye sredstva at, b, greet, lastlog, timelog i today. Komandnyj fajl at daet nam vozmozhnost' skazat' mashine o tom, chto v ukazannoe vremya neobhodimo sdelat' to-to i to-to (vyvesti na ekran soobshchenie ili vypolnit' kakie-to drugie komandy). Zadacha zapuskaetsya v fonovom rezhime, tak chto my mozhem prodolzhat' druguyu rabotu, a fonovaya zadacha vypolnitsya avtomaticheski v ukazannoe vremya. |ta zadacha mozhet sostoyat' iz lyubyh razreshennyh v UNIX komand, poetomu ee vozmozhnosti ochen' gibkie. My prosto predlagaem nekotorye idei, svyazannye s ee ispol'zovaniem. Vtorym sredstvom yavlyaetsya komandnyj fajl b. |to obrabotchik fono- vyh zadach. Ochen' chasto pri porozhdenii fonovyh processov my ne mozhem uznat', kogda oni zakonchilis'. Dlya togo, chtoby eto opredelit', nam ne- obhodimo vruchnuyu prosmotret' tablicu processov ili najti kakoj-to inoj priznak togo, chto dannaya rabota zavershena. Komandnyj fajl b zapuskaet zadachu, upravlyaet operaciyami vvoda-vyvoda i zatem soobshchaet nam o tom, chto zadacha zavershena. Komandnyj fajl greet pokazyvaet, kakim obrazom perevodit' vnut- rennee vremya komp'yutera v bolee ponyatnye pol'zovatelyu kategorii. On razlichaet tri perida sutok (utro, den' i vecher) i reagiruet na nih sootvetstvuyushchimi soobshcheniyami. |to dovol'no prosto, no obespechivaet neplohoe osnovanie dlya podhoda k resheniyu drugih problem, svyazannyh so vremenem. Dalee my predstavlyaem dva sredstva, kotorye obrazuyut bazis siste- my upravleniya vremenem. Pri vypolnenii mnozhestva rabot nam neobhodimo podschitat' vremya, kotoroe my potratili na dannyj proekt, chtoby my mog- li vystavit' nashemu klientu sootvetstvuyushchij schet. Komandnyj fajl lastlog zapuskaetsya avtomaticheski, kogda vy registriruetes' v sisteme. Podderzhivaetsya baza dannyh, v kotoruyu kazhdyj raz zapisyvaetsya vremya vashej registracii dlya posleduyushchego analiza ili hraneniya zapisej. S etim instrumental'nym sredstvom sosedstvuet komandnyj fajl timelog. |to utilita, kotoraya vypolnyaet podschet vremeni. Ona mozhet sledit' za obshchim vremene