takzhe, chto kody statusa vyhoda v interpretatore shell protivopolozhny tem, kotorye ispol'zuyutsya pri programmirovanii na yazyke Si. V Si istinnoe znachenie est' 1, lozhnoe otlichno ot 1. Pri programmi- rovanii na yazyke shell uspeshnym statusom vyhoda (istinoj) yavlyaetsya 0, a plohim statusom (lozh'yu) nenulevoe znachenie. Vy, vozmozhno, udivites', pochemu my tak bespokoimsya o tom, chtoby vernut' lozhnyj status vyhoda, esli komandnyj fajl sobiraetsya prosto napechatat' soobshchenie ob oshibke i prekratit' rabotu. Delo v tom, chto vse instrumental'nye sredstva sistemy UNIX dolzhny byt' sproektirovany tak, chtoby oni mogli byt' svyazany s drugimi komandami i processami, v kotorye oni mogut byt' vstroeny. Vozmozhno, chto drugoj komande neobho- dimo budet vyzvat' komandu tree i proverit', korrektno li ona otrabo- tala. Horoshim stilem proektirovaniya programmnyh sredstv yavlyaetsya prog- nozirovanie i razreshenie mnogih sposobov ispol'zovaniya programmy. Stroki 9-15 proveryayut, chtoby lyubye parametry, peredavaemye ko- mandnoj stroke, byli dejstvitel'no katalogami, kak ukazano v nashem sintaksise. Napomnim, chto v komandnoj stroke mozhet byt' pomeshchen tol'ko odin katalog. Esli my ispol'zuem tol'ko odin parametr i etot parametr ne yavlyaetsya katalogom, to my pechataem soobshchenie ob oshibke i vyhodim. Takim obrazom, operatory proverki garantiruyut, chto libo ne ispol'zu- etsya ni odin parametr, libo edinstvennyj ispol'zuemyj parametr yavlya- etsya korrektnym katalogom. My podoshli k serdcu komandy tree - eto stroki 17-20. Glavnym zdes' yavlyaetsya komanda find sistemy UNIX. Katalog, v kotorom vedetsya poisk, opredelyaetsya pri zapuske komandy. Sintaksis ${1:-.} yavlyaetsya formoj parametricheskoj podstanovki i oznachaet sleduyushchee: esli $1 (chto yavlyaetsya pervym pozicionnym parametrom) ustanovlen (inymi slovami, esli argument byl peredan komandnoj stroke i byl nenulevym), to nuzhno ispol'zovat' eto znachenie. V protivnom sluchae sleduet ispol'zovat' ka- talog . (tekushchij katalog). |tot tip podstanovki daet nam vozmozhnost' zapuskat' komandu tree bez ukazaniya imeni kataloga (kogda posle tree na komandnoj stroke nichego ne sleduet),- to est' rabotat' v rezhime "po umolchaniyu", chto chasto ispol'zuetsya v razlichnyh fajlovyh instrumentah. Komanda find vyvodit na pechat' polnoe imya kazhdogo fajla, kotoryj ej vstrechaetsya. Poskol'ku ne ispol'zuetsya nikakaya special'naya opciya dlya selekcii fajlov, pechatayutsya vse imena. Posle etogo vse polnye ime- na fajlov sortiruyutsya dlya bolee udobnogo chteniya. Takaya sortirovka neskol'ko uvelichivaet vremya raboty komandy, odnako naglyadnost' rezul'- tata govorit o tom, chto eto vremya bylo potracheno s pol'zoj. Dalee, otsortirovannye polnye imena fajlov peredayutsya po prog- rammnomu kanalu komande sed sistemy Unix. Sed - eto "potokovyj redak- tor", ochen' gibkoe sredstvo, kotoroe mozhet byt' ispol'zovano dlya iden- tifikacii i obrabotki razlichnyh obrazcov teksta. Opcii -e yavlyayutsya operaciyami redaktirovaniya, primenyaemymi k postupayushchim dannym. Pervyj operator prosto soobshchaet komande sed, chto nuzhno napechatat' pervuyu stroku, zatem udalit' stroku 1. |to delaetsya dlya togo, chtoby napecha- tat' nazvanie kornevogo kataloga, kotoryj issleduetsya. |toj stroke ne trebuetsya nikakoj dal'nejshej modifikacii, tak kak kornevoj katalog ne imeet nikakih dopolnitel'nyh elementov putej dostupa, kotorye nuzhno bylo by transformirovat' v simvoly kosoj cherty dlya pokaza otstupov. Udalenie pervoj stroki svyazano s tem, chto ona ne nuzhna v dal'nejshej rabote. Vtoraya operaciya redaktirovaniya yavlyaetsya komandoj podstanovki. Ona zamenyaet kazhdyj simvol, otlichnyj ot simvola kosoj cherty (vplot' do pervogo simvola /) na posledovatel'nost' probelov i zatem odin simvol (/). |to izbavlyaet nas ot pechataniya imen promezhutochnyh katalogov vpe- redi polnogo imeni fajla. Bukva g v konce etoj stroki oznachaet, chto eta operaciya vypolnyaetsya global'no, to est' dlya vseh schityvaemyh sim- volov. Itak, teper' stroka sostoit iz nachal'nogo elementa puti i odnoj ili bolee posledovatel'nostej probelov, razdelennyh simvolami kosoj cherty. Simvoly obratnoj kosoj cherty (\) v konce operacij redaktirova- niya - eto simvoly prodolzheniya, kotorye soobshchayut komande sed, chto nuzhno prodolzhit' rabotu so sleduyushchej strokoj v tekushchem pakete operacij re- daktirovaniya. Tret'ya operaciya redaktirovaniya (stroka 19) takzhe yavlyaetsya koman- doj podstanovki i zamenyaet kazhdyj simvol, kotoryj ne yavlyaetsya probelom (vplot' do simvola /) na "ne simvol" i odin simvol kosoj cherty. |tot operator udalyaet probely iz predydushchego rezul'tata redaktirovaniya i smeshchaet simvol v samuyu levuyu poziciyu. |to sozdaet gnezdovuyu indikaciyu, kotoruyu my videli v predydushchem primere. Poslednyaya operaciya redaktirovaniya (v stroke 20) zamenyaet simvol kosoj cherty i vse otlichnye ot nego simvoly (do konca stroki) prosto na simvoly, otlichnye ot /. Otmetim, chto eto ustranyaet samyj pravyj simvol /, kotoryj prisutstvuet v listinge komandy find. V rezul'tate ostaetsya imya podchinennogo fajla, sdvinutoe vpravo. Otmetim sintaksis \1 komandy sed - priznak, otnosyashchijsya k pervomu (v dannom sluchae edinstvennomu) regulyarnomu vyrazheniyu v skobkah, koto- roe emu predshestvuet. V dannom sluchae komande sed ukazano projti sim- voly, sootvetstvuyushchie regulyarnomu vyrazheniyu - simvoly, otlichnye ot /. 2.1.2. thead - pechat' nachala kazhdogo fajla ----------------------------------------------------- IMYA: thead ----------------------------------------------------- thead Pechataet zagolovok (pervye neskol'ko strok) fajlov. NAZNACHENIE Projti fajlovoe derevo i napechatat' pervye neskol'ko strok kazhdo- go fajla. Esli ne ukazan katalog, to thead dejstvuet kak fil'tr. FORMAT VYZOVA thead [dir...] PRIMER VYZOVA $ find $HOME/src -name "*.c" -print | sort | thead Pechataet zagolovki (pervye neskol'ko strok) vseh moih ishodnyh fajlov na yazyke Si. TEKST PROGRAMMY 1 : 2 # @(#) thead v1.0 Prints head of files in tree Author: Russ Sage 2a Pechataet zagolovki fajlov v dereve 4 if [ "`echo $1|cut -c1`" = "-" ] 5 then echo "$0: arg error" 6 echo "usage: $0 [dir ...]" 7 exit 1 8 fi 10 case $# in 11 0) while read FILE 12 do 13 if file $FILE | fgrep text >/dev/null 2>&1 14 then echo "\n:::::::::::::::::::::" 15 echo " $FILE" 16 echo "\n:::::::::::::::::::::" 17 head -15 $FILE 18 fi 19 done;; 20 *) for NAME in $* 21 do 22 find $NAME -type f -print | sort | wile read FILE 23 do 24 if file $FILE | fgrep text >/dev/null 2>&1 25 then echo "\n:::::::::::::::::::::" 26 echo " $FILE" 27 echo "\n:::::::::::::::::::::" 28 head -15 $FILE 29 fi 30 done 31 done;; 32 esac PEREMENNYE SREDY VYPOLNENIYA FILE Soderzhit imya kazhdogo fajla NAME Imya kataloga, zadannoe v komandnoj stroke OPISANIE ZACHEM NUZHEN KOMANDNYJ FAJL thead? Kak uzhe ob®yasnyalos' ranee v etoj glave, ierarhicheskaya fajlovaya sistema yavlyaetsya ochen' znachitel'noj chast'yu sistemy UNIX. Odnako, tol'- ko neskol'ko komand v UNIX imeyut delo neposredstvenno s rekursivnym poiskom fajlov. Edinstvennyj sposob rasshirit' vozmozhnosti sistemy - sozdat' novye rekursivnye utility, rabotayushchie s fajlami. V dannom slu- chae my soedinim nashu strategiyu poiska po derevu s komandoj head siste- my UNIX dlya uproshcheniya identifikacii soderzhimogo vseh fajlov v vydelen- nom segmente fajlovogo dereva. Inogda u nas, vozmozhno, budet voznikat' zhelanie prosmotret' fajly v bolee chem odnom kataloge. V bol'shih proektah razrabotki programmnogo obespecheniya fajly obychno sozdayutsya v neskol'kih ierarhicheskih katalo- gah. Thead mozhet rabotat' so mnozhestvom putej dostupa i vyvodit' zago- lovki (neskol'ko pervyh strok fajlov) v vide nepreryvnogo potoka. CHTO DELAET thead? Thead - eto preprocessornaya komanda k komande head sistemy UNIX. Komanda head ochen' primitivna, no, dobavlyaya k nej upravlyayushchuyu struktu- ru i logiku, my mozhem sozdat' ochen' poleznoe instrumental'noe sredstvo, kotorogo net v standartnoj srede UNIX. Naprimer, my zahoteli prosmotret' zagolovki vseh tekstovyh fajlov v nashem registracionnom kataloge. Esli u nas imeetsya bol'shoe chislo podkatalogov, nam neobhodimo vse ih projti i prosmotret' vse fajly, soderzhashchiesya v nih. My mozhem sdelat' eto s pomoshch'yu komandy $ thead $HOME Esli my hotim prosmotret' tol'ko ishodnye fajly na yazyke Si (*.c), to predstavlennyj vyshe sintaksis ne goditsya dlya etogo. On ne obladaet dostatochnoj gibkost'yu. Nam neobhodimo imet' sposob ukazat' (ili kvalificirovat') fajly v $HOME pered tem, kak prosmatrivat' ih. Tak kak komanda thead mozhet vosprinimat' polnye imena fajlov, my mozhem ispol'zovat' sleduyushchuyu komandu: $ find $HOME -name "*.c" -print | sort | thead Komanda find generiruet spisok fajlov s rasshireniem C, kotoryj sortiruetsya i podaetsya po kanalu na vhod komande thead. Kak vidno iz predstavlennyh dvuh primerov, ves'ma poleznoj dlya komandnogo fajla yavlyaetsya vozmozhnost' poluchat' vhodnye dannye libo iz argumentov komandnoj stroki (kak v pervom primere), libo po programm- nomu kanalu (kak vo vtorom primere). Sposobnost' ispol'zovat' prog- rammnyj kanal pozvolyaet vam primenyat' kakie-libo drugie komandy siste- my UNIX, kotorye mogut otbirat' vhodnye dannye dlya vashego komandnogo fajla. Komanda s takoj dvojnoj vozmozhnost'yu nazyvaetsya FILXTROM. Sredi standartnyh komand sistemy UNIX vy najdete lish' neskol'ko komand-fil'- trov, takih kak wc, awk, sort. |ti dva sposoba postupleniya vhodnyh dannyh v programmy delayut in- terfejs s komandnymi fajlami ochen' gibkim. My mozhem podstraivat' prog- ramnye sredstva pod nashi nuzhdy, a ne podstraivat' nashi zhelaniya pod imeyushcheesya programmnoe obespechenie. Argumentami dlya komandy thead yavlyayutsya katalogi. Nikakih opcij, nachinayushchihsya so znaka "-" net, tol'ko katalog ili polnye imena fajlov. Komanda thead znaet iz sintaksisa, kakoj sposob zapuska komandy budet ispol'zovat'sya. Esli komandnaya stroka soderzhit imya fajla, thead prosmotrit vse pozicionnye parametry. Esli nikakie imena ne ukazany, thead chitaet standartnyj vvod (stdin) i ostanavlivaetsya, kogda vstre- chaet EOF. (Takoe byvaet v sluchae, kogda komanda thead poluchaet vhodnye iz programmnogo kanala.) Dlya kazhdogo fajla, s kotorym rabotaet thead, vypolnyaetsya kontrol' - tekstovyj li eto fajl. Primenenie komandy head k ispolnyaemym modulyam privodit k vyvodu "tainstvennyh" simvolov na ekran i inogda mozhet vyz- vat' damp operativnoj pamyati. PRIMERY 1. $ thead /etc Pechataet dannye iz kazhdogo tekstovogo fajla, nahodyashchegosya v kata- loge /etc. Ochen' poleznaya komanda, tak kak bol'shinstvo fajlov v /etc yavlyayutsya ispolnyaemymi modulyami. Udobno imet' vozmozhnost' bystro izoli- rovat' tekstovye fajly. 2. $ thead /usr/include Prosmatrivaet vse podklyuchaemye fajly (*.h), dazhe v sistemnom pod- kataloge sys. 3. $ find $HOME -ctime 0 -print | thead Ishchet vse fajly v vashem registracionnom kataloge, kotorye byli iz- meneny v techenii poslednih 24 chasov. Dlya kazhdogo fajla proveryaetsya, tekstovyj li on. Esli fajl tekstovyj, to on pechataetsya. POYASNENIYA Stroki 4-8 vypolnyayut proverku oshibok. Tak kak komanda thead ne imeet nikakih opcij, lyubye pozicionnye parametry, kotorye nachinayutsya s defisa (-) yavlyayutsya nevernymi. Esli pervym simvolom pervogo pozicion- nogo parametra okazyvaetsya "-", to pechataetsya soobshchenie "argument error" (oshibka argumenta) vmeste s soobshcheniem o sposobe zapuska i ko- manda thead prekrashchaet rabotu. Nekotorye priemy programmirovaniya dlya interpretatora shell, ispol'zuemye v etih strokah, dovol'no chasto vstrechayutsya v dannoj kni- ge, poetomu imeet smysl ostanovit'sya na nih podrobnee. Proanaliziruem stroku 4, rabotayushchuyu iznutri naruzhu. Komanda echo vydaet soderzhimoe $1 (tekushchij parametr komandnoj stroki), kotoroe pe- redaetsya po programmnomu kanalu komande cut. Komanda cut ispol'zuetsya dlya togo, chtoby vydelit' opredelennye simvoly ili gruppy simvolov iz stroki. V dannom sluchae opciya -c1 ispol'zuetsya dlya polucheniya tol'ko pervogo simvola. KOMANDA cut DLYA BSD V sisteme BSD net komandy cut, no sleduyushchij komandnyj fajl vse zhe "vyrezaet" pervoe nepustoe pole v tekushchem argumente. Predpolozhim, my ispol'zuem komandu dlya generacii celogo nabora strok. V dannom sluchae eto komanda who: for NAME in 'who | sed "s/^\([^ ]*\).*/\1/"' do done Dlya kazhdoj obnaruzhennoj stroki (argumenta) komanda sed dolzhna podstavit' vtoruyu stroku simvolov vmesto pervoj stroki. Pervaya stroka - eto stroka, kotoraya vyrezaetsya. My ishchem ot nachala stroki (^) simvol, otlichnyj ot probela ([^ ]), za kotorym sleduet lyuboe chislo nepustyh simvolov (*). |ta operaciya preryvaetsya po dostizhenii probela. Nabor nepustyh simvolov ogranichivaetsya obratnymi kosymi chertami \( i \). Vposledstvii ssylka na etot nabor daetsya v vide \1. Simvoly .* oznacha- yut, chto posle togo, kak najden probel, neobhodimo schitat' podhodyashchimi vse simvoly do konca stroki. My nahodimsya fakticheski srazu posle togo, chto zaklyucheno v paru simvolov \( i \). Gruppiruya pervyj nabor simvo- lov, otlichnyh ot probela, my poluchaem to, chto yavlyaetsya rezul'tatom ra- boty komandy "cut -f1". V etom meste my podhodim k znakam udareniya (`), okajmlyayushchim vse vyrazhenie. Oni berut rezul'tat raboty vseh komand, zaklyuchennyh v znaki udareniya i peredayut na sleduyushchuyu ohvatyvayushchuyu strukturu v nashih vlo- zhennyh vyrazheniyah. |tot sleduyushchij uroven' okajmleniya ukazan kavychkami. Kavychki prevrashchayut simvol v stroku, chtoby ego mozhno bylo sravnit' s simvolom "-". Sleduyushchij sloj - kvadratnye skobki, ukazyvayushchie uslovie dlya operatora if. |to privodit k tomu, chto generiruetsya nulevoe (isti- na) ili nenulevoe (lozh') uslovie, kotoroe upravlyaet tem, budet li vy- polnena chast' then operatora if-then. My ne sobiraemsya podrobno analizirovat' mnogo strok dannogo ko- mandnogo fajla, no my hotim pokazat' vam, kak chitat' vyrazhenie ili vsyu stroku teksta programmy tak, chtoby eto imelo smysl. Ostal'naya chast' komandnogo fajla predstavlyaet soboj odin ogromnyj operator vybora (case). Argumentom, ispol'zuemym dlya vetvleniya, yavlya- etsya chislo pozicionnyh parametrov v komandnoj stroke. Esli pozicionnyh parametrov net, to v strokah 11-19 aktiviruetsya cikl while. Zametim, chto cikl while vypolnyaet operator chteniya, no ne ukazyvaet, otkuda dol- zhen byt' vzyat ego vhod. |to svyazano s tem, chto vhodom po umolchaniyu yav- lyaetsya standartnyj vvod (stdin). Dlya kazhdogo imeni fajla, kotoroe chi- taetsya iz standartnogo vvoda, zapuskaetsya komanda file sistemy UNIX. Vyhod komandy file peredaetsya po programmnomu kanalu komande fgrep (a ne grep, chto uvelichivaet skorost'), chtoby posmotret', yavlyaetsya li fajl tekstovym. Fakticheskij vyhod komandy fgrep perenapravlyaetsya na nulevoe ust- rojstvo (v beskonechnuyu oblast' pamyati), poskol'ku on nam ne nuzhen. Nas interesuet lish' kod vozvrata posle vypolneniya vsego konveje- ra. Esli komandy file i fgrep otrabotali uspeshno, kodom vozvrata yavlya- etsya nol'. |to istinnoe znachenie, poetomu vypolnyaetsya uchastok cikla posle then (stroki 14-17). Esli fajl ne sushchestvuet ili ne yavlyaetsya tekstovym, to kod vozvrata nenulevoj, i uslovnyj operator zavershaetsya. |to privodit nas v konec cikla, vypolnyaetsya sleduyushchaya iteraciya cikla while i my rassmatrivaem sleduyushchij argument iz standartnogo vvoda. Teper' rassmotrim obrabotku, vypolnyaemuyu po then (stroki 14-17). Dlya kazhdogo fajla, kotoryj yavlyaetsya tekstovym, pechataetsya stroka dvoe- tochij (:) do i posle imeni fajla, a komanda head sistemy UNIX pechataet pervye 15 strok. Takoj scenarij prodolzhaetsya, poka ne zakonchatsya dan- nye v standartnom vvode. Rassmotrim druguyu al'ternativu, pokryvaemuyu dannym operatorom vy- bora. Ona obrabatyvaet situaciyu, kogda imeetsya neskol'ko pozicionnyh parametrov (chto ukazano simvolom * v operatore case). Cikl for probe- gaet vse parametry (stroka 20). Zvezdochka (*) v operatore case oznacha- et, chto podhodit lyuboe znachenie, kotoroe ne podoshlo ranee. |to ulavli- vayushchaya (catchall) opciya. Cikl for ispol'zuet argument $* v kachestve svoego vhoda. On predstavlyaet znacheniya vseh pozicionnyh parametrov, chto yavlyaetsya fakticheski vsej komandnoj strokoj, isklyuchaya imya utility. Komanda find ispol'zuetsya dlya poiska vseh normal'nyh fajlov v ka- taloge. "Normal'nye" fajly ne oznachaet "tol'ko tekstovye fajly", poe- tomu my proverim eto pozzhe. Vyhod komandy find peredaetsya po kanalu komande sort, chtoby sdelat' ego bolee naglyadnym. Otsortirovannyj spisok peredaetsya po kanalu v cikl while, kotoryj pomeshchaet imya fajla v peremennuyu FILE (stroka 27). Proveryaetsya, tekstovyj li fajl, zatem on pechataetsya komandoj head. Esli my sravnim stroki 13-18 i stroki 24-29, to my uvidim, chto eto odin i tot zhe kod. V bol'shinstve yazykov programmirovaniya eto ozna- chalo by, chto my dolzhny oformit' eti stroki kak proceduru i vyzyvat' ee, kogda nuzhno. YAzyk programmirovaniya interpretatora shell, hotya i dovol'no moshchnyj, ne imeet horoshego sposoba realizacii procedur. Poslednij interpretator shell v System V imeet funkcii, kotorye pozvo- lyayut reshit' eti problemy. Otmetim, chto vnutrennij cikl while povtoryaetsya na kazhdom fajle, kotoryj sushchestvuet v opredelennom kataloge, a vneshnij cikl for proho- dit ot kataloga k katalogu. VOZMOZHNYE MODIFIKACII Dlya uvelicheniya gibkosti horosho by dobavit' opcii, chtoby vy mogli perehodit' na komandu find neposredstvenno iz thead. Poleznymi argu- mentami byli by -name dlya izolirovaniya obrazcov imen fajlov i -ctime dlya obrabotki izmenenij, svyazannyh so vremenem. Eshche odnoj privlekatel'noj osobennost'yu bylo by dobavlenie opcii grammaticheskogo razbora (osnovannoj na -) i opcii -n, ukazyvayushchej, chto iz komandy head dolzhno byt' napechatano n strok. VOZMOZHNYE ISSLEDOVANIYA V chem otlichie mezhdu dvumya sleduyushchimi operatorami? $ find $HOME -name "*.c" -print | thead i $ find $HOME -name "*.c" -exec head {} \; Oni vyglyadyat ochen' pohozhe, i oni dejstvitel'no pohozhi. Oni obra- batyvayut odni i te zhe fajly i pechatayut odni i te zhe dannye iz kazhdogo fajla. Osnovnoe otlichie v tom, chto stroka, kotoraya ispol'zuet thead, pechataet horoshee oformlenie vokrug imeni fajla, a chistaya komanda find pechataet nepreryvnyj potok teksta tak, chto ochen' trudno opredelit', kakoj fajl vy prosmatrivaete. 2.1.3. tgrep - poisk strok v dereve fajlovoj sistemy -------------------------------------------------------------- IMYA: tgrep -------------------------------------------------------------- tgrep Poisk stroki po shablonu v dereve fajlov NAZNACHENIE Obhodit fajlovoe derevo i ishchet v kazhdom fajle ukazannuyu stroku. Esli ne ukazan nikakoj katalog, tgrep dejstvuet kak fil'tr. FORMAT VYZOVA tgrep [-c|-h] string [file ...] PRIMER VYZOVA # tgrep "profanity" / Poisk slova "profanity" po vsej sisteme (superpol'zovatel' snova na trope vojny!) TEKST PROGRAMMY 1 : 2 # @(#) tgrep v1.0 Search for string in tree Author: Russ Sage 2a Poisk stroki v dereve 4 OPT="" 6 for ARG in $@ 7 do 8 if [ "`echo $ARG|cut -c1`" = "-" ] 9 then case $ARG in 10 -c) OPT="-name \"*.c\"" 11 shift;; 12 -h) OPT="-name \"*.h\"" 13 shift;; 14 *) echo "$O: incorrect argument" >&2 15 echo "usage: $O [-c|-h] string [file ...] >&2 16 exit 1;; 17 esac 18 fi 19 done 21 case $# in 22 0) echo "$O: argument error" >&2 23 echo "usage: $O [-c|-h] string [dir ...]" >&2 24 exit 2 25 ;; 26 1) while read FILE 27 do 28 grep -y "$1" $FILE /dev/nul 29 done 30 ;; 31 *) STRING=$1; shift 32 eval find "$@" -type f $OPT -print | sort | while read FILE 33 do 34 grep -y "$STRING" $FILE /dev/null 35 done 36 ;; 37 esac PEREMENNYE SREDY VYPOLNENIYA FILE Soderzhit imya kazhdogo fajla OPT Soderzhit special'nye opcii komandy find STRING Vremennaya peremennaya, v kotoroj soderzhitsya stroka poiska OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL tgrep? Kak my mogli videt' na primere dvuh predydushchih utilit, rekursiv- nyj prosmotr fajlov ochen' polezen. On sohranyaet vremya, poskol'ku poz- volyaet izbezhat' poiska fajlov vruchnuyu, a takzhe sozdaet sredstva, koto- rye mogut byt' ispol'zovany v bolee moshchnyh utilitah. CHem bol'she ime- etsya sozdannyh nami sredstv, tem bol'she novyh sredstv my mozhem postro- it' s ih pomoshch'yu. Edinstvennaya problema zaklyuchaetsya v tom, chto vy dolzhny pozabotit'sya ob ih vzaimozavisimosti (kakim utilitam ili sredstvam trebuyutsya drugie utility ili sredstva i kto na kogo vliyaet). Eshche odna oblast', gde UNIX ne imeet "rodnoj" rekursivnoj komandy - eto obrabotka strok. Semejstvo komand tipa grep ochen' veliko, no vse oni rabotayut tol'ko po odnomu fiksirovannomu marshrutnomu imeni fajla. Nam neobhodim preprocessor dlya komandy grep. Pravda, my mozhem dat' zapros na vse fajly vo vsej sisteme ili kakoj-libo ee chasti po nashemu vyboru. Esli my popytaemsya sdelat' eto vruchnuyu, to eto oznachaet, chto my dolzhny mnogo raz nazhimat' na klavishi, chto mozhet privesti k sin- taksicheskoj oshibke. Vy takzhe dolzhny tochno pomnit', kak vy sozdavali komandnuyu stroku, esli vy v sleduyushchij raz zahotite vypolnit' takuyu zhe zadachu. Zachem vypolnyat' gryaznuyu rabotu? Dlya etogo sushchestvuet komp'- yuter. Sozdavaya programmu avtomaticheskogo obhoda dereva fajlov, my osvo- bozhdaemsya dlya togo, chtoby napravit' nashu energiyu na bolee vazhnye veshchi vmesto togo, chtoby vyputyvat'sya iz situacii v sluchae kakogo-libo slish- kom specifichnogo sintaksisa. Odin raz sozdav dostatochno moshchnye sredstva dostupa k fajlam, my mozhem posvyatit' nashe vremya napisaniyu programm, obrabatyvayushchih fajly dannyh dlya resheniya kakih-libo zadach. CHTO DELAET tgrep? Osnovnym prednaznacheniem tgrep yavlyaetsya obespechenie bol'shej gib- kosti i legkosti ispol'zovaniya vozmozhnostej komandy grep. Ee sintaksis tochno takoj zhe, kak i u grep, za isklyucheniem dopustimyh tipov fajlov. V komande grep UNIX v kachestve argumenta mozhet ukazyvat'sya prakticheski lyuboj fajl, no ukazanie tekstovogo fajla imeet naibol'shij smysl. V ko- mande tgrep takzhe mogut ispol'zovat'sya tekstovye fajly, no naibol'shij smysl imeet ukazanie katalogov, poskol'ku my ishchem imena fajlov. Koman- da find rabotala by ne ochen' horosho, esli by pytalas' izvlech' mnozhest- vo imen fajlov iz tekstovogo fajla. V komandnoj stroke mozhet ukazy- vat'sya mnozhestvo imen katalogov, poskol'ku vse oni ispol'zuyutsya kak nachal'noe mesto poiska operatora find. Po umolchaniyu tgrep nahodit vse obychnye fajly. V etoj programme net nikakoj proverki na to, tekstovyj fajl ili net, poskol'ku my ne pytaemsya napechatat' vse na ekran. Poetomu my ishchem stroki simvolov vo vseh fajlah, nachinaya ot arhivnyh i zakanchivaya ispolnyaemymi. Esli vy hotite vybrat' tipy fajlov, ispol'zujte dve opcii, -c i -h. Opciya -c zastavlyaet komandu UNIX find iskat' tol'ko fajly s imena- mi vida *.c. Analogichno, opciya -h sootvetstvuet fajlam *.h. |ti opcii mogut byt' polezny dlya upravleniya programmami na yazyke Si, s kotorymi my bolee detal'no poznakomimsya v glave 4. |ti opcii ne samoe vazhnoe, no oni pokazyvayut, kak legko dobavit' novye opcii v programmu. Esli pri vyzove byla ukazana kakaya-to inaya opciya, krome upomyanu- tyh, vyvoditsya soobshchenie ob oshibke i programma ostanavlivaetsya. Podob- no thead, tgrep yavlyaetsya fil'trom. PRIMERY 1. $ tgrep unix $HOME Poisk lyubogo vhozhdeniya slova unix vo vseh fajlah moego registra- cionnogo kataloga. 2. $ tgrep -c "^sleep()$" $HOME/src Poisk vyrazheniya (nachalo stroki, simvol'naya stroka, konec stroki) vo vseh ishodnyh fajlah na yazyke Si v registracionnom kataloge s ishodnymi tekstami (opciya -c). 3. # find /usr/src -name "*.c" -print | tgrep "ioctl" Poisk vseh vyzovov ioctl v ishodnyh Si-fajlah, nachinaya s kataloga /usr/src. (Obratite vnimanie, chto ya yavlyayus' superpol'zovatelem. |to vidno iz togo, chto ya zanimayus' poiskom v ogranichennoj chasti sistemy, a imenno v ishodnyh distributivah, a takzhe iz togo, chto v kachestve sim- vola priglasheniya ispol'zuetsya simvol "#".) 4. $ tgrep "| more" `find . -type f -print` Poisk simvola vertikal'noj cherty (|), posle kotorogo sleduet slo- vo more, v spiske imen fajlov, generiruemom operatorom find. Find pe- chataet imena vseh fajlov tekushchego kataloga i vseh podkatalogov, koto- rye yavlyayutsya obychnymi fajlami. 5. $ tgrep trap /bin /usr/bin /etc Poisk komandy preryvaniya (trap) vo vseh komandnyh fajlah interp- retatora shell, kotorye imeyutsya v treh katalogah. POYASNENIYA V stroke 4 peremennaya OPT, v kotoroj hranyatsya neobyazatel'nye ko- mandy operatora find, inicializiruetsya v nulevoe znachenie. Stroki 6-18 vypolnyayut proverku na nalichie oshibok. Proveryaetsya, yavlyaetsya li pervym simvolom kazhdogo pozicionnogo parametra simvol "-". Esli proverka uspeshna, to proveryaetsya na korrektnost' sam argument. Vozmozhnymi opciyami yavlyayutsya -c i -h. Esli ukazano chto-libo drugoe, vy- voditsya soobshchenie ob oshibke i programma zavershaetsya. Obratite vnima- nie, chto s pomoshch'yu komandy shift dopustimye opcii udalyayutsya iz komand- noj stroki. |to sdelano dlya togo, chtoby vposledstvii vyrazhenie $@ mog- lo byt' ispol'zovano dlya polucheniya tol'ko argumentov stroki poiska i marshruta. Vyrazhenie $@ yavlyaetsya drugoj formoj vyrazheniya $ *, v kotoroj ono rasprostranyaetsya na vse pozicionnye parametry. Odnako v posleduyu- shchem tekste my uvidim odno bol'shoe otlichie mezhdu nimi. Eshche odin tryuk sdelan pri prisvoenii znacheniya peremennoj OPT v stroke 10. |toj peremennoj nam neobhodimo prisvoit' znachenie, kotoroe vklyuchaet v sebya paru kavychek, poskol'ku kavychki dolzhny byt' chast'yu stroki poiska, kotoraya v konce koncov ispol'zuetsya operatorom find. Odnako obnaruzhenie vtoroj kavychki obychno ZAVERSHAET operator prisvaiva- niya, a my etogo v dannom sluchae ne hotim. Vyhodom iz situacii yavlyaetsya ispol'zovanie simvola \, kotoryj otmenyaet special'noe znachenie sleduyu- shchego za nim simvola. V dannom sluchae special'noe znachenie bylo by kon- com stroki prisvaivaniya. Takim obrazom, kavychka pered zvezdochkoj (*) v stroke 10 rassmat- rivaetsya kak chast' znacheniya peremennoj OPT, vmesto togo, chtoby zaver- shat' operaciyu prisvaivaniya. Sleduyushchaya vstrechennaya kavychka takzhe dolzhna byt' sohranena v znachenii peremennoj, chtoby ukazat' konec hranimoj zdes' stroki poiska, poetomu ona takzhe ekranirovana simvolom \. Poslednyaya kavychka v etoj stroke ne ekranirovana obratnoj kosoj chertoj. |ta kavychka sootvetstvuet svoej obychnoj funkcii v smysle interpretato- ra shell i zavershaet operator prisvaivaniya. Vam nuzhno poeksperimentirovat' s ispol'zovaniem kavychek, chtoby ponyat' ego. Kogda kakoj-to komandnyj fajl ne zhelaet rabotat' pravil'- no, no oshibok ne vidno, prover'te pravil'nost' ispol'zovaniya kavychek. Ostavshayasya chast' komandnogo fajla - eto operator case (stroki 21-37), kotoryj imeet delo s chislom argumentov komandnoj stroki. Esli net nikakih argumentov, pechataetsya soobshchenie ob oshibke i my vyhodim iz programmy. My ved' ne mozhem delat' nikakogo poiska komandoj grep, esli my dazhe ne znaem, kakuyu stroku nuzhno iskat'. Esli ukazan tol'ko odin argument, to eto dolzhna byt' stroka po- iska. |to takzhe oznachaet, chto v komandnoj stroke ne ukazany imena faj- lov i poetomu my chitaem ih so standartnogo ustrojstva vvoda, t.e. ko- mandnyj fajl dejstvuet kak fil'tr. Cikl while (stroki 26-29) chitaet so standartnogo vvoda imya kazhdogo fajla dlya poiska v nem komandoj grep nuzhnoj stroki. Opciya -y komandy grep oznachaet nechuvstvitel'nost' k re- gistru simvolov pri poiske. Ispol'zovanie etoj opcii daet nam horoshie shansy popast' na nuzhnuyu stroku. Drugoj interesnoj osobennost'yu etogo cikla yavlyayutsya dve komandy grep v strokah 28 i 34. My ishchem nuzhnuyu stroku ne tol'ko v fajle, no takzhe v kataloge /dev/null. |to kazhetsya strannym? Da. Problema zaklyu- chaetsya v samoj komande grep. Grep znaet, kogda v komandnoj stroke uka- zano bolee odnogo fajla. Esli imeetsya bolee odnogo fajla, to imya fajla vyvoditsya na ekran do vyvoda najdennoj stroki. Esli zhe v komandnoj stroke ukazan tol'ko odin fajl, to ego imya ne vyvoditsya, poskol'ku schitaetsya, chto pol'zovatel' dolzhen pomnit' eto imya. |to sozdaet prob- lemy pri napisanii komandnyh fajlov, kogda vy imeete mnogo imen faj- lov, no oni obrabatyvayutsya po odnomu. My obrabatyvaem fajly po odnomu, poskol'ku esli by my ispol'zovali ukazanie gruppovogo imeni fajlov s pomoshch'yu metasimvolov, to moglo by okazat'sya slishkom mnogo imen fajlov v odnoj komandnoj stroke dlya komandy grep. Poetomu vmesto ispol'zova- niya nekotoroj zamyslovatoj shemy dlya sokrashcheniya kolichestva argumentov, my izbegaem etogo putem obrabotki v cikle kazhdogo fajla po ocheredi. Poskol'ku na samom dele my ishchem bol'shoe kolichestvo raznyh strok, to my hotim videt' imena fajlov, v kotoryh oni byli najdeny. Pri ukazanii v komandnoj stroke grep kataloga /dev/null, grep vsegda pechataet imya fajla do vyvoda najdennoj stroki v nashem cikle, poskol'ku teper' imeetsya dva imeni fajla v kachestve argumentov. Konech- no, v /dev/null nichego nel'zya najti, poskol'ku on pust po opredeleniyu. Poslednij obrazec v operatore case (stroki 31-36) - eto lovushka. On sootvetstvuet lyubomu kolichestvu pozicionnyh parametrov sverh odno- go, chto pozvolyaet nam imet' peremennoe chislo katalogov v komandnoj stroke. Dazhe hotya my mozhem ukazat' neskol'ko katalogov v komandnoj stro- ke, pervym argumentom po-prezhnemu yavlyaetsya stroka poiska. Ne tak legko skazat': "nachinaya so vtorogo parametra", poetomu my sohranyaem stroku poiska (v peremennoj STRING - Prim. perev.) i ubiraem ee komandoj shift. Teper' my mozhem poluchit' dostup k ostal'noj chasti komandnoj stroki s pomoshch'yu vyrazheniya $@. Davajte posmotrim, chto proishodit, kogda my ssylaemsya na peremen- nuyu $OPT dlya polucheniya opcij komandy find. Dopustim, my vyzvali tgrep s opciej -c. Kogda my prisvaivaem znachenie peremennoj OPT, my stavim stroku c v vide "*.c" vnutri dvojnyh kavychek, poskol'ku my ne zhelaem, chtoby shell raskryval etu stroku (t.e. traktoval ee kak imena vseh fajlov, sootvetstvuyushchih dannomu obrazcu) imenno sejchas. Teper', kak tol'ko k peremennoj $OPT est' obrashchenie v komande find, znacheniem OPT yavlyaetsya *.c, chto oznachaet poisk fajlov, simvol'nye imena kotoryh sootvetstvuyut *.c. Dlya otmeny simvol'noj interpretacii my dolzhny ispol'zovat' komandu eval. Pered vypolneniem komandy find komanda eval zastavlyaet shell povtorno analizirovat' komandu v otnoshenii rasprost- raneniya znacheniya peremennoj. Na etom prohode vyrazhenie "*.c" prevrashcha- etsya v *.c, chto razreshaet generaciyu imen fajlov takim obrazom, chtoby byli prosmotreny vse eti fajly. Ukazyvaya $@ v komande find, my mozhem proizvodit' poisk vo vseh katalogah srazu. Takim obrazom, nam nuzhno vyzvat' find tol'ko odin raz, chto pozvolyaet sberech' vremya central'nogo processora. Odnoj iz in- teresnyh problem, voznikshih pri razrabotke dannogo komandnogo fajla bylo to, chto vyrazhenie vida $* ne rabotalo. V komande find voznikala oshibka sohraneniya. Dazhe zapusk shell'a v rezhime -x (ustanovlennyj flag razresheniya vypolneniya) ne razreshil problemu. Izmenenie sintaksisa, ka- zhetsya, pomoglo razobrat'sya s nej. Okazyvaetsya, prichina v tom, chto vy- razhenie $* raskryvaetsya v "$1 $2 ...", v to vremya kak vyrazhenie $@ prevrashchaetsya v "$1" "$2" (t.e. v otdel'nye argumenty). Proishodilo to, chto vyrazhenie $* peredavalo imena neskol'kih katalogov komande find kak odnu stroku. Komanda find ne mogla obnaruzhit' fajl takogo tipa, poetomu prekrashchala vypolnenie. Kogda zhe vmesto etogo bylo ispol'zovano vyrazhenie $@, komanda find poluchila neskol'ko nezavisimyh strok s ime- nami. |to vpolne podoshlo komande find, i vse zarabotalo. Takie melkie detali vsegda trebuyut mnogo vremeni dlya izucheniya! VOZMOZHNYE ISSLEDOVANIYA V chem raznica mezhdu dvumya sleduyushchimi operatorami? grep "$1" `find "$2" -print` i find "$2" -print | while read F do grep "$1" $F done Oni kazhutsya sovershenno pohozhimi, no sushchestvuet razlichie v glav- nom. Pervyj operator - eto odin vyzov komandy grep. Argumentami yavlya- yutsya mnozhestvo imen fajlov, postavlyaemyh komandoj find. Esli find sge- neriruet slishkom mnogo imen fajlov, to vypolnenie komandy zavershitsya. O tom, chto sgenerirovano slishkom mnogo imen fajlov, nikakogo predup- rezhdeniya ne vydaetsya, no bol'shoe kolichestvo fajlov fatal'no dlya grep. Poetomu my dolzhny rassmatrivat' takoj sintaksis kak nedopustimyj v ob- shchem sluchae. Vtoroj operator - eto cikl. On rabotaet medlennee i vyzyvaet grep mnogo raz, chto zabiraet mnogo vremeni central'nogo processora. Odnako polozhitel'nym momentom yavlyaetsya to, chto cikl poluchaet dannye po konve- jeru, kotoryj fakticheski ne imeet ogranichenij na chislo dannyh, kotoroe on mozhet imet'. Nasha programma nikogda neozhidanno ne prekratit vypol- nenie. 2.1.4. paths - nahozhdenie puti dostupa k ispolnyaemym fajlam, so special'nymi opciyami ------------------------------------------------------------ IMYA: paths ------------------------------------------------------------ paths Opredelitel' marshrutnyh imen fajlov so special'nymi opciyami NAZNACHENIE Vyvodit na ekran katalog, v kotorom raspolagaetsya fajl, vydaet imya fajla v dlinnom formate ili ishchet fajly s ustanovlennym bitom pol'- zovatel'skogo identifikatora (setuid bit files) v katalogah po ukazan- nomu marshrutu. FORMAT VYZOVA paths [-l] [-s] file [file ...] PRIMER VYZOVA $ paths -l ed ex vi Vydaet v dlinnom formate imena fajlov, kotorye yavlyayutsya ispolnyae- mymi modulyami redaktorov ed, ex i vi TEKST PROGRAMMY 1 : 2 # @(#) paths v1.0 Path locator with special options Author: Russ Sage 2a Opredelitel' mestonahozhdeniya fajlov so special'nymi opciyami 4 FORMAT="path" 6 for ARG in $@ 7 do 8 if [ '`echo $ARG | cut -c1`" = "-" ] 9 then case $ARG in 10 -l) FORMAT="ls" 11 shift;; 12 -s) FORMAT="set" 13 set "1";; 14 *) echo $0: arg error" >&2 15 echo "usage: $0 [-l] [-s] file [file ...]" >&2 16 exit 1;; 17 esac 18 fi 19 done 21 IFS="${IFS}:" 23 for FILE in $@ 24 do 25 for DIR in $PATH 26 do 27 case $FORMAT in 28 path) if [ -f $DIR/$FILE ] 29 then echo $DIR/$FILE 30 fi;; 31 ls) if [ -f $DIR/$FILE ] 32 then ls -l $DIR/$FILE 33 fi;; 34 set) echo "\n:::::::::::::::::::" 35 echo "$DIR" 36 echo "::::::::::::::::::::" 37 ls -al $DIR | grep "^[^ ]*s[^ ]*";; 38 esac 39 done 40 done PEREMENNYE SREDY VYPOLNENIYA ARG Soderzhit kazhdyj argument komandnoj stroki DIR |lement s imenem kataloga v peremennoj PATH FILE Soderzhit imya kazhdogo fajla v komandnoj stroke FORMAT Tip trebuemogo formata vyhodnyh dannyh IFS Peremennaya shell'a, razdelitel' polej PATH Peremennaya shell'a, puti k katalogam ispolnyaemyh modulej OPISANIE ZACHEM NAM NUZHEN KOMANDNYJ FAJL paths? V nashej srede interpretatora shell peremennaya s imenem PATH so- derzhit imena katalogov, otdelennye drug ot druga simvolami dvoetochiya (:). Kazhdyj raz, kogda vy vvodite komandu posle priglasheniya shell'a, interpretator shell, nachinaya s pervogo kataloga, ukazannogo v peremen- noj PATH, smotrit, nahoditsya li vvedennaya vami komanda v etom katalo- ge. Esli da, to komanda vypolnyaetsya. Esli net, to shell idet v sleduyu- shchij katalog, ukazyvaemyj peremennoj PATH, i tak dalee, poka ne budut provereny vse katalogi. Esli komanda vse zhe ne budet najdena, to vy poluchite sleduyushchee soobshchenie ob oshibke: ------------------------- | | $ whatchamacallit | sh: whatchamacallit: not found | | Takoj poisk komandy osushchestvlyaetsya avtomaticheski, no sama sistema ne soobshchaet vam, GDE razmeshchena komanda. Nam neobhodima utilita, koto- raya ishchet i vyvodit na ekran marshrut k ukazannomu fajlu. Imeya takuyu utilitu, vy mozhete ispol'zovat' kratchajshie puti polucheniya togo, chto vam nuzhno, i vypolnyat' mnozhestvo razlichnyh tryukov. Vy mozhete kombini- rovat' podobnuyu komandu s drugimi komandami dlya sozdaniya gorazdo bolee moshchnyh sredstv. S marshrutom mozhno takzhe kombinirovat' komandy more, ls, file i cd sistemy UNIX. Vozmozhno, vy obnaruzhite i drugie komandy po mere eksperimentirovaniya. Komanda, neskol'ko pohozhaya na tu, kotoruyu my ishchem, sushchestvuet gde-to v mire sistemy UNIX Systev V. Naprimer, v sisteme AT&T eto ko- manda where. V sisteme UNIX Berkeley eto komanda which (tekst na yazyke Si-shell'a) ili whereis (ispolnyaemaya programma). Whereis daet dopolni- tel'nuyu informaciyu, takuyu kak mesto razmeshcheniya fajlov s ishodnymi tekstami (v kataloge /usr/src). Uvidev, kak my sozdaem nashu sobstven- nuyu komandu poiska marshruta, vy mozhete modificirovat' ee dlya obespeche- niya raboty s osobennostyami nekotoryh drugih komand i prisposobit' ta- kie veshchi k vashim nuzhdam. Prezhde chem my udovletvorim svoi prihoti, davajte beglo glyanem na komandu path, bolee prostuyu, chem paths. Vsya programma vyglyadit primer- no tak: IFS="${IFS}:" for FILE in $@ do for DIR in $PATH do if [ -f $DIR/$FILE ] then echo $DIR/$FILE fi done done Osnovnaya ideya ochen' prosta. Sperva my dobavlyaem dvoetochie (:) k razdelitelyu polej. Nam neobhodimo sohranit' znacheniya, prinyatye po umolchaniyu (probely, tabulyacii, simvoly novoj stroki), tak, chtoby my mogli vse-taki obrabatyvat' komandnuyu stroku s probelami v kachestve simvolov-razdelitelej. Simvol : daet nam vozmozhnost' otdel'no rassmat- rivat' kazhdyj marshrut, hranimyj v peremennoj PATH. Vsya programma predstavlyaet soboj dva cikla for. Vneshnij cikl prosmatrivaet imena vseh fajlov, ukazannyh v komandnoj stroke. Vnut- rennij cikl posledovatel'no obhodit vse katalogi, soderzhashchiesya v pere- mennoj PATH. Dlya kazhdogo fajla prosmatrivayutsya vse katalogi s cel'yu opredeleniya, soderzhit li etot katalog fajl s takim imenem. Polnoe marshrutnoe imya predstavlyaet soboj kombinaciyu prefiksa-kataloga i imeni fajla (nazyvaemyh imenem kataloga i bazovym imenem sootvetstvenno). Vstroennaya shell-komanda test ispol'zovana dlya opredeleniya togo, su- shchestvuet li fajl v opredelennom kataloge. Esli vasha peremennaya PATH vyglyadit tak: PATH=.:/bin:/usr/bin:/etc/:$HOME/bin to vnutrennij cikl vypolnit pyat' iteracij v takom poryadke: ., /bin, /usr/bin, /etc i, nakonec, $HOME/bin. Esli by zapros imel vid "path ll" dlya poiska utility, kotoruyu my sozdadim pozzhe v etoj glave, to re- zul'tat mog by vyglyadet' tak: --------------------------------------------- | | /usr/bin/ll | /usr/russ/bin/ll | | |to znachit, chto komanda ll byla najdena v dvuh mestah iz vashego nabora marshrutov poiska. CHTO DELAET paths? Teper', kogda my znaem, kak rabotaet bolee prostaya komanda path, my mozhem po dostoinstvu ocenit' dopolnitel'nye vozmozhnosti special'noj komandy polucheniya marshruta - komandy paths. Paths imeet tri osnovnye funkcii. Ona mozhet vypolnyat'sya kak osnovnaya komanda path, kotoruyu my uzhe rassmotreli, i davat' polnoe marshrutnoe imya ispolnyaemogo modulya. Ona mozhet vydavat' marshrut fajla v dlinnom formate. Ona takzhe mozhet vydat' spisok vseh fajlov s ustanovlennym pol'zovatel'skim identifika- torom (setuid bit files), kotorye est' v vashih marshrutnyh katalogah. (Sm. glavu 8, gde opisany bity setuid.) Sintaksis vyzova nemnogo otlichaetsya dlya raznyh opcij. Dlya togo chtoby ispol'zovat' format vydachi marshruta ili format komandy ls, nuzhna takaya komandnaya stroka: paths [-l] file [file ...] kak, naprimer, v komandah "paths ls who date" ili "paths -l ll". Dlya poiska fajlov s ustanovlennym pol'zovatel'skim identifikatorom (setuid files) ne nuzhno ukazyvat' imena fajlov v komandnoj stroke. Vsya komanda do