Komandnyj yazyk shell Proizvodstvenno-vnedrencheskij kooperativ "I N T E R F E J S" Dialogovaya Edinaya Mobil'naya Operacionnaya Sistema Demos/P 2.1 Komandnyj yazyk SHELL Moskva 1988 ANNOTACIYA Opisyvaetsya interpretator komandnogo yazyka shell. Opi- sany elementy yazyka, operator I struktura programm na shell, a takzhe vstroennye vozmozhnosti. 1. VVEDENIE V semejstve operacionnyh sistem, sovmestimyh s OS UNIX, yazyk SHELL ispol'zuetsya v kachestve standartnogo yazyka uprav- leniya zadaniyami, t.e. yavlyaetsya osnovnym yazykom obshcheniya pol'- zovatelya s sistemoj. On predostavlyaet sredstva dlya opisaniya takih dejstvij, kak, naprimer, zapusk kakogo-libo kompilya- tora ili programmy, sozdanie, kopirovanie i unichtozhenie faj- lov, opros sostoyaniya processov. Krome togo, SHELL shiroko primenyaetsya i v kachestve yazyka razrabotki osobyh programm - komandnyh fajlov. Poslednee svojstvo ob®yasnyaetsya tem, chto SHELL imeet mnogo obshchego s universal'nymi yazykami programmi- rovaniya, v chastnosti, konstrukcii, kotorye pozvolyayut sozda- vat' programmy, soderzhashchie proverki uslovij i cikly. Vazhnym dostoinstvom yazyka, yavlyaetsya vozmozhnost' ego poetapnogo izucheniya. Dlya togo chtoby nachat' rabotu v sis- teme, pol'zovatelyu dostatochno oznakomit'sya s razdelom "Osnovnye ponyatiya" dannogo dokumenta. 2. OSNOVNYE PONYATIYA Posle registracii pol'zovatelya vsya dal'nejshaya rabota s sistemoj vypolnyaetsya pod upravleniem programmy sh - interp- retatora komandnogo yazyka SHELL. Vo vremya raboty pol'zovatel' vydaet komandy i poluchaet soobshcheniya sistemy o rezul'tatah ih vypolneniya. Kak pravilo, pri poluchenii komandy interpretator opredelyaet imya fajla, soderzhashchego programmu, kotoruyu neobhodimo vypolnit', i porozhdaet process, kotoryj rabotaet pod upravleniem zadannoj programmy. Isklyucheniya sostavlyayut sluchai, kogda vyzyvayutsya vstroennye komandy yazyka SHELL, pri etom ukazannye dejstviya vypolnyayutsya neposredstvenno interpretatorom bez porozhdeniya novogo processa. Poskol'ku, v kachestve imeni komandy mozhet ukazyvat'sya lyuboj fajl, soderzhashchij ispolnyaemuyu programmu, sushchestvuet prakticheski bezgranichnaya vozmozhnost' rasshireniya nabora komand. S ponyatiem processa v DEMOS svyazano ponyatie sredy. Sreda formiruetsya processom-roditelem i soderzhit dopolni- tel'nuyu informaciyu o sposobe vypolneniya processa. Kazhdomu processu stavitsya v sootvetstvie tri fajla: standartnyj fajl vvoda, standartnyj fajl vyvoda i fajl diagnosticheskih soob- shchenij. Pri zapuske komandy pol'zovatel' mozhet ukazat' fajly kotorye budut primenyat'sya v kachestve standartnyh. Po umol- chaniyu, vvod/vyvod informacii osushchestvlyaetsya s terminala pol'zovatelya. Harakternoj chertoj sistem, sovmestimyh s OS UNIX, yavlya- etsya estestvennaya vozmozhnost' raboty s neskol'komi proces- sami odnovremenno. Pol'zovatel' mozhet ukazat' v komande, chto sootvetstvuyushchij process dolzhen rabotat' kak fonovyj - 3 - (t.e. perehod k priemu sleduyushchej komandy osushchestvlyaetsya bez ozhidaniya okonchaniya dannogo processa). Krome togo, sushchest- vuet vozmozhnost' zadaniya komand, dlya vypolneniya kotoryh interpretator porozhdaet neskol'ko vzaimodejstvuyushchih proces- sov. Pri etom sozdaetsya cepochka processov (konvejer), v kotoroj obrabatyvaemaya informaciya peredaetsya ot odnogo pro- cessa drugomu po kanalu mezhprocessnoj svyazi. 2.1. Prostye komandy Prostye komandy sostoyat iz odnogo ili neskol'kih slov, razdelennyh probelami. Pervoe slovo yavlyaetsya imenem vypolnya- emoj komandy; vse ostal'nye slova peredayutsya komande v kachestve parametrov. Naprimer, who predstavlyaet soboj komandu, kotoraya vydaet informaciyu o pol'zovatelyah, zaregistrirovannyh v sisteme. Komanda ls -l vydaet spisok fajlov tekushchego spravochnika. Parametr -l uka- zyvaet komande ls, chto nuzhna informaciya o harakteristikah, razmere i date sozdaniya kazhdogo fajla. 2.2. Fonovye processy Dlya togo, chtoby vypolnit' komandu, interpretator yazyka SHELL obychno sozdaet novyj process i zhdet ego zaversheniya. Pol'zovatel' mozhet zapuskat' processy v fonovom rezhime, pri etom interpretator perehodit k obrabotke sleduyushchej komandy srazu posle zapuska processa, ne ozhidaya okonchaniya ranee zapushchennogo. Naprimer, komanda: cc program.c & vyzyvaet kompilyator dlya obrabotki fajla program.c. Simvol &, zavershayushchij stroku, ukazyvaet interpretatoru komand, chto sleduet perejti k obrabotke sleduyushchej komandy bez ozhidaniya okonchaniya translyacii. Dlya posleduyushchego nablyudeniya za hodom processa sistema soobshchaet unikal'nyj nomer, po kotoromu mozhno zaprashivat' informaciyu o ego sostoyanii. 2.3. Zadanie imen fajlov V yazyke SHELL predusmotren mehanizm dlya generacii spiska imen fajlov, kotorye sootvetstvuyut nekotoromu obrazcu. Naprimer, pri vypolnenii komandy: ls -l *.c v kachestve parametrov ls peredayutsya imena vseh fajlov - 4 - tekushchego spravochnika, kotorye okanchivayutsya na .c. Simvol * imeet special'noe znachenie (t.e. yavlyaetsya metasimvolom yazyka SHELL), emu sootvetstvuet lyubaya stroka (v tom chisle pustaya). Pri zadanii obrazcov mogut ispol'zovat'sya sleduyushchie metasim- voly: * sootvetstvuet lyuboj stroke simvolov (vklyuchaya pustuyu stroku); ? sootvetstvuet lyubomu odinochnomu simvolu; [...] sootvetstvuet lyubomu iz perechislennyh vnutri skobok simvolov; para simvolov, razdelennyh znakom minus, budet sootvetstvovat' lyubomu simvolu iz zadannogo leksicheskogo promezhutka. Naprimer, obrazcu [A-YA]* sootvetstvuyut vse imena v tekushchem spravochnike, kotorye nachi- nayutsya s propisnoj russkoj bukvy, a obrazcu /usr/nata/test/? sootvetstvuyut vse odnosimvol'nye imena iz spravochnika /usr/nata/test. Esli ne najdeno ni odnogo fajla, sootvetst- vuyushchego zadannomu obrazcu, to v kachestve parametra komande peredaetsya sam obrazec. Opisannyj mehanizm sokrashchaet vremya nabora komand i pozvolyaet vybirat' imena, otvechayushchie nuzhnomu obrazcu. On takzhe mozhet ispol'zovat'sya pri poiske fajlov. Naprimer, komanda echo /usr/nata/*/core nahodit i pechataet polnye imena vseh fajlov core iz podspra- vochnikov spravochnika /usr/nata (komanda echo yavlyaetsya stan- dartnoj komandoj DEMOS, kotoraya pechataet svoi parametry, razdelyaya ih probelami). Iz obshchih pravil, ukazannyh dlya obrazcov, imeetsya edinstvennoe isklyuchenie. Simvol '.' v nachale imeni fajla dolzhen ukazyvat'sya yavno. Poetomu komanda: echo * budet vydavat' vse imena fajlov v tekushchem spravochnike, koto- rye ne nachinayutsya s tochki, a komanda: echo .* - 5 - napechataet imena fajlov, nachinayushiesya s tochki. |to pozvo- lyaet isklyuchit' neumyshlennuyu podmenu imen "." i "..", kotorye sootvetstvenno oznachayut tekushchij spravochnik i osnovnoj spra- vochnik. 2.4. Otmena special'nogo znacheniya metasimvolov Dlya yazyka SHELL simvoly imeyut special'noe znachenie (polnyj spisok metasimvolov priveden v tabl.2 Prilozheniya). Lyuboj metasimvol, kotoromu predshestvuet obratnaya cherta, teryaet svoe special'noe znachenie (dejstvie \ rasprostranya- etsya tol'ko na sleduyushchij za nim simvol, pri etom sam znak \ ignoriruetsya). Tak, komanda: echo \? napechataet tol'ko znak voprosa '?', a komanda: echo \\ vydast lish' odin simvol \. Dlya zapisi dlinnyh konstrukcij bolee chem v odnoj stroke, special'noe znachenie simvola novoj stroki \n otmenyaetsya. Znak \ udoben dlya otmeny special'nogo znacheniya otdel'- nyh simvolov. Kogda zhe neobhodimo ekranirovat' srazu nes- kol'ko metasimvolov, takoj mehanizm okazyvaetsya slishkom gro- mozdkim. V etom sluchae posledovatel'nost' znakov zaklyuchaetsya v apostrofy. Naprimer, komanda: echo hh'****'hh napechataet hh****hh Simvol novoj stroki \n, zaklyuchennyj v apostrofy, teryaet svoe special'noe znachenie. Odnako, ekranirovat' sam apostrof takim sposobom nel'zya. Eshche odnim mehanizmom otmeny special'nogo znacheniya sim- volov yavlyaetsya zaklyuchenie ih v dvojnye kavychki. 2.5. Zadanie fajlov vvoda/vyvoda Rezul'taty raboty bol'shinstva komand zapisyvayutsya v standartnyj fajl vyvoda. Po umolchaniyu vsya vydavaemaya proces- som informaciya otobrazhaetsya na terminal pol'zovatelya. Pri neobhodimosti ona mozhet byt' zapisana i v obychnyj fajl. Tak, v sleduyushchem primere: - 6 - ls -l > filels konstrukciya "> filels" rassmatrivaetsya kak ukazanie ispol'- zovat' v kachestve standartnogo vyvoda komandy ls zadannyj fajl (v dannom sluchae fajl filels). Esli fajl s dannym ime- nem otsutstvuet, interpretator komand sozdaet ego. Esli fajl sushchestvuet, to ego ishodnoe soderzhimoe zamenyaetsya informa- ciej, vydavaemoj komandoj. Esli trebuetsya sohranit' soderzhimoe fajla, dobaviv v nego postupayushchuyu informaciyu, vmesto simvola >&gt; ispol'zuetsya konstrukciya >&gt;>&gt;. Naprimer: ls >&gt;>&gt; filels V dannom sluchae, esli fajl ne sushchestvuet, on takzhe predvari- tel'no sozdaetsya sistemoj. Analogichnye vozmozhnosti predostavlyayutsya i dlya pereopre- deleniya standartnogo fajla vvoda (po umolchaniyu dannye vvo- dyatsya s terminala). Dlya etoj celi ispol'zuetsya simvol <&lt;. Naprimer, komanda: wc <&lt; filels vydaet kolichestvo strok fajla filels. Dalee perechisleny osnovnye konstrukcii, ispol'zuemye dlya zadaniya fajlov vvoda/vyvoda. >&gt; fajl V kachestve standartnogo fajla vyvoda ispol'zuetsya fajl, kotoryj perezapisyvaetsya zanovo ili sozdaetsya, esli ranee ne sushchestvoval. >&gt;>&gt; fajl Postupayushchaya informaciya dobavlyaetsya k soderzhimomu fajla. Esli fajl ne sushchestvuet, on predvaritel'no sozdaetsya. <&lt; fajl V kachestve standartnogo fajla vvoda ispol'zuetsya fajl. <&lt;<&lt; fajl CHtenie lokal'nogo fajla (sm. razdel 4.8). Posleduyushchie stroki peredayutsya komande v kachestve informacii stan- dartnogo fajla vvoda do teh por, poka ne vstretitsya stroka, soderzhashchaya posledovatel'nost' simvolov fajl. Esli special'noe znachenie pervogo simvola stroki fajl otmeneno, vypolnyayutsya podstanovki znachenij makropere- mennyh i rezul'tatov vypolneniya komand. >&gt;& cifra Informaciya, zapisyvaemaya v fajl s deskriptorom cifra, - 7 - peredaetsya v standartnyj fajl vyvoda. <&lt;& cifra Standartnym fajlom vvoda yavlyaetsya fajl s deskriptorom cifra. <&lt;&- Fajl standartnogo vvoda zakryt na zapis'. >&gt;&- Fajl standartnogo vyvoda zakryt na chtenie. 2.6. Svyaz' processov, konvejery i fil'try Informaciya, vydavaemaya v standartnyj fajl vyvoda odnoj komandoj, mozhet neposredstvenno peredavat'sya drugoj komande v kachestve soderzhimogo standartnogo fajla vvoda. Naprimer, v rezul'tate raboty komand: ls | wc budet vydano obshchee chislo simvolov v imenah tekushchego spravoch- nika. Sostavnaya komanda, obrazovannaya s pomoshch'yu operacii "|", nazyvaetsya konvejerom. V dannom sluchae ona vypolnyaet dejstvie ekvivalentnoe komandam: ls >&gt; filels wc <&lt; filels rm filels za tem isklyucheniem, chto dlya hraneniya promezhutochnyh rezul'ta- tov ne ispol'zuetsya nikakih fajlov. V konvejere kazhdaya komanda rabotaet kak parallel'nyj nezavisimyj process, informaciya peredaetsya v odnom napravlenii. Esli vhodnye dan- nye processa-poluchatelya eshche ne gotovy, ili vyhodnye dannye processa-istochnika ne uspevayut obrabatyvat'sya, to vypolnenie sootvetstvuyushchego processa priostanavlivaetsya. Fil'trom nazyvaetsya komanda, kotoraya, poluchaya dannye iz standartnogo fajla vvoda, proizvodit kakuyu-libo rabotu i vydaet rezul'tat v standartnyj fajl vyvoda. Tipichnym prime- rom fil'tra mozhet sluzhit' komanda grep, kotoraya, chitaya dan- nye iz standartnogo fajla vvoda, vybiraet stroki, soderzhashchie ukazannuyu posledovatel'nost' simvolov i vydaet ih v stan- dartnyj fajl vyvoda. Naprimer, komanda: ls | grep old vydaet tol'ko te imena fajlov tekushchego spravochnika, kotorye soderzhat posledovatel'nost' simvolov old. Konveer mozhet sostoyat' bolee chem iz dvuh processov. Naprimer, konstruk- ciya: ls | grep bak | wc -l - 8 - mozhet ispol'zovat'sya dlya podscheta chisla imen fajlov v teku- shchem spravochnike, kotorye soderzhat posledovatel'nost' simvo- lov bak. 2.7. Makroperemennye Imya makroperemennoj predstavlyaet soboj posledovatel'- nost' bukv, cifr i simvolov podcherkivaniya, nachinayushchuyusya s bukvy. Pri vypolnenii operatora prisvaivaniya v komandnuyu sredu tekushchego processa zanositsya zapis' tipa imya=znachenie, v levoj chasti kotoroj stoit imya makroperemennoj, a v pravoj - posledovatel'nost' simvolov, yavlyayushchayasya ee znacheniem. V komandnoj stroke vse vhozhdeniya vida $imya zamenyayutsya znacheni- yami sootvetstvuyushchih makroperemennyh (isklyuchenie sostavlyayut sluchai, kogda podobnye konstrukcii zaklyucheny v apostrofy '...' ili simvolu $ predshestvuet znak \). Primery: USER=nata HOME=/usr/nata prisvaivanie znachenij makroperemennym USER i HOME; null= prisvaivanie makroperemennoj znacheniya pustoj stroki; echo $USER vypolnenie podstanovki znacheniya makroperemennoj (rezul'tat - stroka nata). Peremennye mogut ispol'zovat'sya dlya vvedeniya sokrashche- nij. Tak, pri vypolnenii komand: b=/usr/nata/bin mv pgm $b fajl pgm budet peremeshchen iz tekushchego spravochnika v spravoch- nik /usr/nata/bin. V bolee obshchem vide makrovyzov zapisyvaetsya sleduyushchim obrazom: ${imya_makroperemennoj} Figurnye skobki v dannom sluchae igrayut rol' razdelitelej i ispol'zuyutsya togda, kogda za imenem sleduet bukva ili cifra. Naprimer, v rezul'tate vypolneniya gruppy komand: P=PROB PA=PERA echo ${P}A $PA - 9 - budet vydan tekst: PROBA PERA V yazyke SHELL sushchestvuyut special'nye makroperemennye, kotorye opredelyayutsya pered nachalom vypolneniya komandy (isk- lyuchenie sostavlyaet makroperemennaya ?, kotoraya poluchaet zna- chenie posle vypolneniya komandy): ? Desyatichnoe celoe chislo - kod zaversheniya poslednej vypolnennoj komandy. V bol'shinstve sluchaev, pri uspesh- nom vypolnenii komand, znachenie koda zaversheniya ravno nulyu. V protivnom sluchae, esli komanda zakonchilas' ne udachno, kod zaversheniya ne raven nulyu. # Kolichestvo poluchennyh parametrov. $ Nomer dannogo processa. Poskol'ku dlya kazhdogo processa sushchestvuet svoj nomer, to eta makroperemennaya chasto ispol'zuetsya dlya sozdaniya unikal'nyh imen vremennyh fajlov. Naprimer: ps a >&gt;/tmp/ps$$ . . . rm /tmp/ps$$ ! Nomer poslednego processa, zapushchennogo v kachestve fono- vogo. - Tekushchie klyuchi (ustanovlennye rezhimy) interpretatora sh tipa -x i -v. Perechislennye dalee makroperemennye yazyka SHELL, imeyut dlya sistemy osobyj smysl i ne dolzhny ispol'zovat'sya v drugih celyah: MAIL Pered tem kak vydat' pervuyu podskazku interpretator prosmatrivaet fajl, imya kotorogo yavlyaetsya znacheniem etoj makroperemennoj. Esli dannyj fajl izmenyalsya s momenta poslednego prosmotra, budet vydanno soobshchenie you have mail (vam prishla pochta). Znachenie etoj mak- roperemennoj obychno ustanavlivaetsya pri vypolnenii fajla .profile. Naprimer: MAIL=/usr/mail/nata HOME Imya spravochnika dlya komandy cd bez parametrov. Poisk fajlov, imena kotoryh ne nachinayutsya s simvola /, - 10 - osushchestvlyaetsya v tekushchem spravochnike. Dlya smeny teku- shchego spravochnika primenyaetsya komanda cd. Naprimer, komanda: cd /usr/nata/bin naznachaet tekushchim spravochnik /usr/nata/bin. Komanda: cat show vyvodit na terminal soderzhimoe fajla show iz spravoch- nika /usr/nata/bin. Komanda cd bez parametrov ekviva- lentna komande: cd $HOME znachenie etoj makroperemennoj takzhe obychno opredelya- etsya v fajle .profile. PATH |ta makroperemennaya opredelyaet spisok spravochnikov, prosmatrivaemyh pri poiske komandy. Esli znachenie makroperemennoj PATH ne opredeleno, to prinimaetsya sleduyushchij poryadok prosmotra: tekushchij spravochnik, spra- vochnik /bin i spravochnik /usr/bin. Pri yavnom zadanii znacheniya makroperemennoj PATH imena spravochnikov raz- delyayutsya simvolom :. Naprimer: PATH= :/usr/nata/bin:/bin:/usr/bin oznachaet, chto prosmotr spravochnikov budet vestis' v sleduyushchem poryadke: tekushchij spravochnik (pustaya poziciya pered pervym simvolom :), /usr/nata/bin, /bin i /usr/bin. Takim obrazom, konkretnye pol'zovateli mogut imet' svoi lichnye komandy, dostupnye nezavisimo ot togo, kakoj spravochnik yavlyaetsya tekushchim. Esli imya komandy nachinaetsya s simvola / (t.e. zadanno polnoe imya ispolnyaemogo fajla), to poisk v spravochnikah ne vedetsya. V etom sluchae delaetsya vsego odna popytka vypolnit' ukazannuyu komandu. PS1 Podskazka interpretatora (po umolchaniyu dlya obychnogo pol'zovatelya - $). PS2 Podskazka interpretatora, oznachayushchaya prodolzhenie vvoda (po umolchaniyu >&gt;). IFS Mnozhestvo simvolov-razdelitelej, interpretiruemyh kak probely. - 11 - TERM Tip svyazannogo s processom terminala. 2.8. Vydacha podskazok Pri rabote s terminala, kogda interpretator gotov pri- nyat' sleduyushchuyu komandu, po umolchaniyu vydaetsya podskazka $. Ona mozhet byt' izmenena komandoj: PS1=vvod: posle vypolneniya kotoroj podskazka budet imet' vid stroki vvod:. Esli vvedennaya stroka soderzhit sintaksicheski nezaver- shennuyu konstrukciyu, dlya prodolzheniya vvoda interpretator vydaet v kachestve podskazki simvol >&gt;. Podskazka, oboznachayu- shchaya prodolzhenie vvoda, mozhet byt' izmenena s pomoshch'yu komandy prisvaivaniya novogo znacheniya makroperemennoj PS2. Naprimer, komanda: PS2=Prodolzhenie: ustanovit v kachestve podskazki stroku Prodolzhenie:. 2.9. Sostavnye komandy Sushchestvuet dva sposoba ob®edineniya neskol'kih komand v odnu sostavnuyu komandu: { spisok_komand; } (spisok_komand) V pervom sluchae ukazannyj spisok_komand prosto vypolnyaetsya. Vo vtorom - zadannyj spisok_komand tozhe vypolnyaetsya, no uzhe kak otdel'nyj process. Naprimer, konstrukciya: (cd x; rm junk) vypolnyaet komandu rm junk v spravochnike x, ne izmenyaya teku- shchego spravochnika, a komandy { cd x; rm junk; } dayut tot zhe samyj rezul'tat, no spravochnik x stanovitsya tekushchim. 2.10. Vstroennye komandy Kak pravilo, pri vypolnenii kakoj-libo komandy interp- retator porozhdaet otdel'nyj process. Odnako, sushchestvuet ryad - 12 - funkcij, vypolnenie kotoryh v kachestve otdel'nogo processa libo neeffektivno, libo nevozmozhno. Prezhde vsego eto otno- sitsya k komandam, vypolnenie kotoryh zavisit ot sostoyaniya lokal'nyh peremennyh interpretatora. Komandy, vypolnyayushchiesya neposredstvenno interpretatorom (bez porozhdeniya processa), nazyvayutsya vstroennymi komandami yazyka. S tochki zreniya pol'zovatelya vstroennye komandy prakticheski ne otlichayutsya po svoim svojstvam ot ostal'nyh komand sistemy, za isklyucheniem togo, chto dlya nih obychno nel'zya pereopredelit' standartnye fajly vvoda/vyvoda. Dalee privoditsya spisok vstroennyh komand s kratkim opisaniem vypolnyaemyh funkcij: : |ta komanda ne vypolnyaet nikakih dejstvij, ee kod zaversheniya raven nulyu. Tem ne menee proizvoditsya pods- tanovka znachenij makroperemennyh. . fajl Schityvaet i vypolnyaet komandy iz fajla. Dlya nahozhdeniya spravochnika, soderzhashchego fajl, ispol'zuetsya makropere- mennaya PATH. cd [spravochnik] Ob®yavit' ukazannyj spravochnik tekushchim. Esli parametr ne zadan, v kachestve imeni spravochnika ispol'zuetsya znachenie makroperemennoj HOME. Sinonimom komandy cd yavlyaetsya komanda chdir. eval [komanda ...] Vypolnyayutsya vse makropodstanovki, posle chego, slovo eval otbrasyvaetsya i ostal'nye simvoly obrabatyvayutsya kak obychnaya komandnaya stroka. exec [komanda ...] Tekushchij process zameshchaetsya processom vypolnenya ukazan- noj komandy. Dopuskaetsya pereopredelenie standartnyh fajlov vvoda/vyvoda. exit [N] Preryvanie vypolnenie tekushchego processa. Soobshchaetsya kod zaversheniya N. Esli parametr N otsutstvuet, to ispol'zuetsya kod zaversheniya poslednej vypolnennoj komandy. export [imya ...] Perechislennye makroperemennye avtomaticheski vvodyatsya v sredu porozhdaemyh processov. Esli parametry ne zadany, vydaetsya spisok eksportiruemyh makroperemennyh. login [parametr ...] Registraciya pol'zovatelya v sisteme bez sozdaniya novogo processa (ekvivalent komandy exec login parametr ...). - 13 - newgrp [parametr ...] Zamena tekushchego identifikatora gruppy pol'zovatelej (ekvivalent komandy "exec newgrp parametr ..."). read imya ... Iz standartnogo fajla vvoda schityvaetsya odna stroka. Zatem makroperemennym imya ... posledovatel'no prisvai- vayutsya znacheniya slov, sostavlyayushchih etu stroku. Kod zaversheniya komandy raven nulyu vo vseh sluchayah, krome teh, kogda spisok parametrov dlinnee, chem chislo slov v schitannoj stroke. readonly [imya ...] Zapreshchaetsya pereoprelenie perechislennyh makroperemen- nyh. Esli parametry ne zadany, vydaetsya spisok vseh makroperemennyh, opredelennyh kak readonly (tol'ko dlya chteniya). set [-ekntuvx [parametr ...]] Ustanavlivaet rezhimy raboty interpretatora yazyka SHELL. Mogut zadavat'sya sleduyushchie klyuchi: -e V neinteraktivnom rezhime vyzyvaet nemedlennoe pre- ryvanie processa pri obnaruzhenii oshibki v vypolne- nii komandy. -k Vse opredelennye makroperemennye eksportiruyutsya v sredu zapuskaemyh processov. -n Proizvodit tol'ko sintaksicheskij kontrol' komand. -t Preryvaet vypolnenie processa posle togo, kak budet schitana i vypolnena odna komanda. -u Ustanavlivaet rezhim diagnostiki oshibki pri popytke ispol'zovat' neopredelennye makroperemennye. -v Ustanavlivaet rezhim pechati vvodimyh strok. -x Raspechatyvaet komandy i ih parametry po mere vypolneniya. - Otmenyaet klyuchi -v i -x. Ustanovlennye klyuchi soderzhatsya v makroperemennoj -. Ostal'nym parametram komandy set prisvaivayutsya znacheniya pozicionnyh parametrov "1, 2, ...". Esli parametry ne zadany, pechataetsya spisok znachenij vseh makroperemen- nyh. shift Pozicionnym parametram "2, 3, ..." prisvaivayutsya znache- niya parametrov "1, 2, ..." sootvetstvenno. - 14 - times Vydaetsya vremya, zatrachennoe pol'zovatelem i sistemoj na vypolnenie processa. trap [komanda] [N ...] Pri poluchenii perechislennyh signalov vypolnyaetsya uka- zannaya komanda. umask [ddd] Pri formirovanii deskriptorov vnov' sozdavaemyh fajlov priznaki razreshenie chteniya i razreshenie zapisi ustanav- livayutsya soglasno maske ddd. Cifra '0' v sootvetstvuyu- shchem razryade oznachaet ustanovku priznaka. Format maski sovpadaet s formatom deskriptora, zadavaemym v komande chmod. Rassmatrivayutsya tol'ko te pozicii, kotorye opredelyayut razreshenie chteniya zapisi rw. Esli parametr otsutstvuet, vydaetsya tekushchee znachenie maski. Napri- mer, komanda umask 000 ustanovit rezhim, pri kotorom vsem porozhdaemym fajlam budet ustanavlivat'sya priznaki razresheniya chteniya zapisi dlya vseh pol'zovatelej. wait [N] Ozhidaet okonchaniya vypolneniya processa s nomerom (N) i prisvaivaet ego kod zaversheniya makroperemennoj ?. 3. KOMANDNYE FAJLY Posledovatel'nost' komand mozhno zapisat' v fajl i vypolnit', ukazav imya etogo fajla. Takim obrazom, obespechi- vaetsya vozmozhnost' sozdaniya dostatochno slozhnyh programm na yazyke SHELL. V yazyke sushchestvuyut operatory upravleniya (ope- rator cikla, uslovnogo perehoda, vybora) i apparat peredachi parametrov. Vypolnenie komandnogo fajla mozhet osushchestvlyat'sya dvumya sposobami. V pervom sluchae, ukazyvaetsya imya interpretatora yazyka SHELL - sh, rezhimy ego raboty, imya i parametry komand- nogo fajla. Vo vtorom - tol'ko imya fajla i parametry (ana- logichno vyzovu lyuboj komandy sistemy). Pri etom predpolaga- etsya, chto fajl imeet priznak "vypolnenie razresheno". Rezul'tat raboty komandy ne zavisit ot sposoba ee vypolneniya, poetomu, kak pravilo, ispol'zuetsya vtoroj vari- ant. Zapusk komandy s yavnym ukazaniem imeni interpretatora chasto primenyaetsya dlya otladki komandnyh fajlov, kogda neob- hodimo zadavat' razlichnye rezhimy raboty sh. Naprimer, komanda: sh file [parametry] vyzyvaet interpretator dlya vypolneniya komand iz fajla file. Esli v komandnoj stroke zadany parametry, oni peredayutsya - 15 - porozhdaemomu processu v vide znachenij makroperemennyh "1", "2" i t.d. Naprimer, esli fajl wg soderzhit stroku: who | grep $1 to komanda sh wg nata vypolnyaet dejstvie ekvivalentnoe who | grep nata Priznak togo, chto fajl mozhno vypolnyat' obychno ustanav- livaet komponenta, sozdavshaya dannyj fajl (naprimer kompilya- tor). Komandnye fajly, kak pravilo, sozdayutsya neposredst- venno pol'zovatelem i dannogo priznaka ne soderzhat. Poetomu voznikaet neobhodimost' ustanovit' dlya fajla priznak vypol- nenie razresheno. Dlya etogo mozhno ispol'zovat' komandu chmod. Naprimer, v rezul'tate raboty komandy: chmod +h wg fajl wg poluchaet priznak vypolnenie razresheno. Obrabotka parametrov pri zapuske komandy vypolnyaetsya po sleduyushchim pravilam: - Obrabatyvayutsya vse imeyushchiesya metasimvoly yazyka. - Komandnaya stroka razbivaetsya na slova - posledovatel'- nosti simvolov, ne soderzhashchie simvolov-razdelitelej, k kotorym otnosyatsya probel, simvol nachala stroki i znak tabulyacii. Esli v kachestve parametra trebuetsya pere- dat' tekst, kotoryj soderzhit probely, on beretsya v kavychki. - Vydelennye slova posledovatel'no prisvaivayutsya makrope- remennym s imenami "0", "1", "2", i t.d. - V kachestve znacheniya makroperemennoj "#" ustanavlivaetsya chislo parametrov. - Znacheniya vseh parametrov (za isklyucheniem nulevogo) prisvaivayutsya makroperemenoj *. T.e. makrovyzov $* budet zamenyat'sya na stroku, soderzhashchuyu znacheniya vseh parametrov. Naprimer, esli komandnyj fajl show imeet vid: - 16 - echo ' Komanda $0 =' $0 ' Znachenie $1 =' $1 ' Znachenie $2 =' $2 ' CHislo parametrov =' $# ' Znachenie $* =' $* to v rezul'tate vypolneniya komandy: show pervyj vtoroj budet poluchen sleduyushchij tekst: Komanda $0 = show Znachenie $1 = pervyj Znachenie $2 = vtoroj CHislo parametrov = 2 Znachenie $* = pervyj vtoroj 3.1. Kommentarii V komandnoj stroke yazyka SHELL mozhno ispol'zovat' kommenta- rij, kotoryj sluzhit dlya uluchsheniya chitaemosti komandnyh faj- lov. Kommentarij dolzhen nachinat'sya simvolom # i raspola- gat'sya v konce komandnoj stroki. Tak kak chast' stroki, sle- duyushchaya za simvolom #, ne rassmatrivaetsya interpretatorom, v nej mogut vstrechat'sya lyubye simvoly. Naprimer: # |to primer kommentariya ls # Budet vypolnena komanda # ls (eto tozhe kommentarij) Sleduet pomnit', chto esli # yavlyaetsya pervym simvolom fajla, emu pridaetsya osobyj smysl - eto priznak togo, chto dolzhen ispol'zovat'sya interpretator yazyka csh. 3.2. Komanda test Komanda test, hotya i ne yavlyaetsya konstrukciej yazyka SHELL, neobhodima pri sozdanii komandnyh fajlov. V rezul'- tate vypolneniya komandy osushchestvlyaetsya proverka zadannogo usloviya i soobshchaetsya kod ee zaversheniya, kotoryj mozhet ispol'zovat'sya v operatorah uslovnogo perehoda i cikla. Naprimer, kod zaversheniya komandy test -f file raven nulyu, esli fajl file sushchestvuet, i ne raven nulyu - v protivnom sluchae. - 17 - Osnovnye vozmozhnosti komandy mozhno proillyustrirovat' na sleduyushchih primerah: test s istinno, esli argument s ne yavlyaetsya pustoj strokoj; test -f file istinno, esli fajl sushchestvuet; test -r file istinno, esli fajl mozhno chitat'; test -w file istinno, esli v fajl mozhno pisat'; test -d file istinno, esli fajl yavlyaetsya spravochnikom. 3.3. Operator for V yazyke SHELL sushchestvuet vozmozhnost' posledovatel'nogo povtoreniya kakoj-libo gruppy komand dlya kazhdogo elementa ukazannogo spiska. Dlya etoj celi ispol'zuetsya operator cikla for, kotoryj imeet sleduyushchij format: for imya [in slovo1 slovo2 ...] do spisok_komand done gde spisok_komand - eto posledovatel'nost' odnoj ili nes- kol'kih prostyh komand, razdelennyh simvolami ; ili perechis- lennyh na raznyh strokah. Zarezervirovannye slova do i done raspoznayutsya tol'ko v tom sluchae, esli oni sleduyut za simvo- lom novoj stroki ili tochki s zapyatoj. Imya - eto makropere- mennaya yazyka SHELL, kotoraya v processe vypolneniya spiska_komand posledovatel'no prinimaet znacheniya slovo1 slovo2 .... Esli konstrukciya in slovo1 slovo2 ... otsutst- vuet, to cikl vypolnyaetsya odin raz dlya kazhdogo zadannogo parametra (t.e. po umolchaniyu predpolagaetsya in $*). V kachestve primera mozhno privesti komandu tel, kotoraya pros- matrivaet fajl /usr/lib/pfone, soderzhashchij stroki vida: ... Ivanov I.I. 224 01 01 Petrov P.P. 123 07 07 Sizov V.I. 224 44 94 ... Tekst procedury tel: for i do grep $i usr/lib/pfone; done - 18 - V rezul'tate vypolneniya komandy: tel Petrov budut napechatany te stroki fajla /usr/lib/pfone, kotorye soderzhat posledovatel'nost' simvolov Petrov, a komanda: tel Ivanov Petrov napechataet snachala stroki, soderzhashchie posledovatel'nost' simvolov Ivanov, a zatem te stroki, kotorye soderzhat simvoly Petrov. Eshche odnim primerom ispol'zovaniya cikla for yavlyaetsya komandnyj fajl create: for i do >&gt; $i; done Rezul'tatom vypolneniya komandy create alpha beta yavlyaetsya sozdanie dvuh pustyh fajlov alpha i beta. 3.4. Operator case Rassmotrim v kachestve primera komandnyj fajl add, soderzhashchij sleduyushchij tekst: case $# in 1) cat >&gt;>&gt; $1;; 2) cat >&gt;>&gt; $2 <&lt; $1;; *) echo 'Format: add [otkuda] kuda';; esac Pri vyzove komandy s odnim argumentom, naprimer: add file parametr $# poluchaet znachenie '1', i komanda cat kopiruet informaciyu iz standartnogo fajla vvoda v konec fajla file. Komanda: add file1 file2 dopishet soderzhimoe fajla file1 v konec fajla file2. Esli chislo parametrov, peredavaemyh komande add, otlichno ot 1 i ot 2, to pechataetsya soobshchenie "Format: add kuda [otkuda]". Format operatora case: - 19 - case slovo in [obrazec[|obrazec] ...) spisok_komand;;] ... [obrazec[|obrazec] ...) spisok_komand[;;]] esac Interpretator posledovatel'no sravnivaet slovo s kazhdym iz ukazannyh obrazcov. Pri obnaruzhenii sootvetstviya vypolnya- etsya zapisannyj pri obrazce spisok_komand, posle chego, obra- botka operatora zavershaetsya. Simvol * predstavlyaet soboj obrazec, kotoryj sootvetstvuet lyuboj stroke. Kazhdyj spisok_komand (za isklyucheniem poslednego) neobhodimo zaver- shat' simvolami ;;. Pervoe zhe sovpadenie slova s obrazcom polnost'yu oprede- lyaet mnozhestvo vypolnyaemyh komand. V sleduyushchem primere komandy, ukazannye za vtorym simvolom *, ne budut vypol- nyat'sya nikogda: case $# in *) ...;; *) ...;; esac Operator case chasto ispol'zuetsya dlya proverki korrekt- nosti parametrov. |to mozhno proillyustrirovt' sleduyushchim frag- mentom komandy cc: for i do case $i in -[ocs]) ...;; -*) echo 'neizvestnyj klyuch $i';; *.c) lib/c0 $i ...;; *) echo 'neizvestnyj parametr $i';; esac done Esli usloviem vypolneniya kakogo-libo spiska_komand yavlyaetsya gruppa obrazcov, to pri ih perechislenii v komande case v kachestve razdelitelya ispol'zuetsya simvol |. Tak, operator: case $i in -h) echo $i -y) echo $i esac mozhet byt' zapisan sluduyushchim obrazom: - 20 - case $i in -h|-y) echo $i esac Pri poiske sootvetstvuyushchego obrazca primenimy osnovnye soglasheniya ob otmene special'nogo znacheniya metasimvolov, tak obrazec v konstrukcii: case $i in ?) ... budet sootvetstvovat' simvolu ?. 3.5. Operatory while i until Operator while prednaznachen dlya organizacii ciklov, vypolnenie kotoryh proizvoditsya do teh por, poka kod zaver- sheniya ukazannogo spiska komand raven nulyu. Obshchaya forma operatora while: while spisok_komand_1 [do spisok_komand_2] done V kazhdom cikle vypolnyayutsya komandy iz spiska_komand_1. Operator while proveryaet kod zaversheniya poslednej prostoj komandy iz etogo spiska: esli on raven nulyu, vypolnyaetsya spisok_komand_2 i cikl povtoryaetsya, inache - vypolnenie cikla zavershaetsya. Naprimer, pri vypolneniya sleduyushchih operatorov: while test $1 do ... shift done i for i do ... done budet poluchen odinakovyj rezul'tat. Operator shift pereimenovyvaet pozicionnye parametry "2, 3, ..." v parametry "1, 2, ..." sootvetstvenno; znachenie parametra "1" teryaetsya. - 21 - Drugim sposobom organizacii cikla yavlyaetsya ispol'zova- nie operatora until: until spisok_komand_1 [do spisok_komand_2] done V otlichie ot while cikl until budet vypolnyat'sya do teh por, poka kod zaversheniya poslednej komandy spiska_komand_1 ne budet imet' nulevoe znachenie. 3.6. Operatory break i continue Operatory break i continue ispol'zuyutsya v konstrukciyah for, while i until. Operator break preryvaet rabotu cikla, v tele kotorogo on vypolnyaetsya. V kachestve primera mozhno privesti prog- rammu, kotoraya vydaet znacheniya svoih parametrov, raspolozhen- nyh do simvola %: for i do case $i in %) break;; *) echo $i;; esac done Operator continue osushchestvlyaet perehod k sleduyushchej ite- racii cikla. Dlya primera rassmotrim komandnyj fajl, kotoryj vyvodit tol'ko te parametry, kotorye nachinayutsya s bukvy: for i do case $i in [A-YAa-ya]*) echo $i;; [A-Za-z]*) echo $i;; *) continue;; esac done 3.7. Operator if Uslovnyj operator vida: if spisok_komand_1 then spisok_komand_2 [else spisok_komand_3] fi - 22 - proveryaet kod zaversheniya poslednej prostoj komandy spiska_komand_1: esli on raven nulyu, vypolnyaetsya spisok_komand_2, inache - spisok_komand_3. Komanda if mozhet ispol'zovat'sya sovmestno s komandoj test, naprimer, dlya proverki sushchestvovaniya fajla: if test -f $1 then echo "FAJL $1 SUSHCHESTVUET" else echo "FAJL $1 NE SUSHCHESTVUET" fi Pri mnogokratnom povtorenii uslovnogo operatora, napri- mer: if ... then ...