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 >> ispol'zuetsya
konstrukciya >>>>. Naprimer:
ls >>>> 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 <<.
Naprimer, komanda:
wc << filels
vydaet kolichestvo strok fajla filels.
Dalee perechisleny osnovnye konstrukcii, ispol'zuemye
dlya zadaniya fajlov vvoda/vyvoda.
>> fajl
V kachestve standartnogo fajla vyvoda ispol'zuetsya fajl,
kotoryj perezapisyvaetsya zanovo ili sozdaetsya, esli
ranee ne sushchestvoval.
>>>> fajl
Postupayushchaya informaciya dobavlyaetsya k soderzhimomu fajla.
Esli fajl ne sushchestvuet, on predvaritel'no sozdaetsya.
<< fajl
V kachestve standartnogo fajla vvoda ispol'zuetsya fajl.
<<<< 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.
>>& cifra
Informaciya, zapisyvaemaya v fajl s deskriptorom cifra,
- 7 -
peredaetsya v standartnyj fajl vyvoda.
<<& cifra
Standartnym fajlom vvoda yavlyaetsya fajl s deskriptorom
cifra.
<<&- Fajl standartnogo vvoda zakryt na zapis'.
>>&- 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 >> filels
wc << 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 >>/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 >>).
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 >>. 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 >> $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 >>>> $1;;
2) cat >>>> $2 << $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 ...
else ...
if ...
then ...
else if ...
...
fi
fi
fi
mozhno ispol'zovat' sokrashchennuyu zapis':
if ...
then ...
elif ...
then ...
elif ...
...
fi
Konstrukciya
if komanda1
then komanda2
fi
mozhet byt' zapisana v vide:
komanda1 && komanda2
V konstrukcii
komanda1 || komanda2
komanda2 vypolnyaetsya tol'ko v tom sluchae, esli komanda1 ne
- 23 -
byla vypolnena uspeshno. Kodom zaversheniya obeih konstrukcij
yavlyaetsya kod zaversheniya poslednej prostoj komandy.
3.8. Lokal'nyj fajl
V procedure tel, rassmotrennoj v ranee, ishodnye dannye
dlya komandy grep berutsya iz fajla /usr/lib/pfone. Obrabaty-
vaemye dannye mogut neposredstvenno vklyuchat'sya v komandnyj
fajl. Dlya etogo oni oformlyayutsya v vide lokal'nogo fajla. V
sleduyushchem primere:
for i
do grep $i <<<<!
...
Ivanov I.I. 224 01 01
Petrov P.P. 123 07 07
Sizov V.I. 224 44 94
...
!
done
stroki, zaklyuchennye mezhdu simvolami <<<<! i !, peredayutsya
komande grep v kachestve dannyh standartnogo fajla vvoda.
Stroka-ogranichitel' ! vybrana zdes' proizvol'no: glavnoe,
chtoby ona sovpadala s posledovatel'nost'yu simvolov, stoyashchej
za znakami <<<<.
Esli sleduyushchaya za <<<< posledovatel'nost' simvolov ne
nachinaetsya so znaka \, to prezhde chem lokal'nyj fajl stanet
dostupnym komande, v nem vypolnyayutsya vse podstanovki para-
metrov.
Naprimer, pust' fajl edg soderzhit stroki vida:
ed $3 <<<< %
g/$1/s//$2/g
w
%
pri vyzove:
edg stroka1 stroka2 file
budet dostignut rezul'tat, kotoryj mozhno poluchit' pri vypol-
nenii sleduyushchej posledovatel'nosti komand:
ed file <<<< %
g/stroka1/s//stroka2/g
w
%
- 24 -
3.9. Otladka komandnyh fajlov
V SHELL ispol'zuyutsya dva mehanizma otladki komandnyh
fajlov. Pervyj iz nih:
set -v
vyvodit stroki komandnogo fajla po mere ih chteniya. |tot
rezhim primenyaetsya pri poiske sintaksicheskih oshibok. Dlya ego
ispol'zovaniya ne trebuetsya proizvodit' modifikaciyu komand-
nogo fajla, naprimer:
sh -v proc...
zdes' proc - imya komandnogo fajla. Klyuch -v mozhet ispol'zo-
vat'sya vmeste s klyuchom -n, predotvrashchayushchim vypolnenie sledu-
yushchih za nim komand (komanda set -n blokiruet terminal do teh
por, poka ne vvoditsya priznak konca fajla EOF).
Komanda
set -h
vyvodit komandy po mere ih vypolneniya. Dlya otmeny klyuchej -x
i -v mozhno vospol'zovat'sya komandoj
set -
a dlya ustanovki - prisvoit' sootvetstvuyushchee znachenie makro-
peremennoj -.
4. PARAMETRY I OBLASTX DEJSTVIYA MAKROPEREMENNYH
Makroperemennye, opredelennye v odnom processe, pri
otsutstvii yavnyh ukazanij ne dostupny v drugih processah.
Dlya togo chtoby obespechit' vozmozhnost' peredachi porozhdaemomu
processu kakoj-libo informacii, v yazyke predusmotrenny
sredstva, kotorye pozvolyayut:
- peredavat' komande parametry;
- eksportirovat' opredeleniya makroperemennyh iz sredy
tekushchego processa v sredu porozhdaemogo;
- opredelyat' makroperemennye i peredavat' ih opredeleniya
v sredu porozhdaemogo processa bez izmeneniya sredy teku-
shchego.
Tak, v sleduyushchem primere:
USER=nata komanda
pered vypolneniem fajla komanda makroperemennaya USER
- 25 -
prinimaet znachenie nata. Pri ispol'zovanii flaga -k opera-
tory vida imya=znachenie mogut vstavlyat'sya v lyuboe mesto
spiska parametrov. Takie imena nazyvayutsya klyuchevymi para-
metrami. Znacheniya parametrov prisvaivayutsya makroperemennym
s imenami "1", "2", ... N (poskol'ku chislo v imeni makrope-
remennoj ukazyvaet poziciyu parametra v komandnoj stroke,
takie parametry nazyvayutsya pozicionnymi).
Dlya togo chtoby prisvoit' znacheniya pozicionnym paramet-
ram neposredstvenno iz komandnogo fajla ispol'zuetsya komanda
set. Tak, v sleduyushchem primere
set *
parametru "1" budet prisvoeno znachenie imeni pervogo fajla
tekushchego spravochnika, parametru "2" - imya vtorogo fajla i
t.d.
Pri vypolnenii komand interpretator proizvodit sleduyu-
shchie dejstviya:
- Podstanovka znachenij parametrov, naprimer:
$user
- Podstanovka rezul'tatov vypolneniya komand, naprimer:
`pwd`
V teh sluchayah, kogda v stroke trebuetsya vypolnit' nes-
kol'ko vlozhennyh makropodstanovok, ispol'zuetsya vstro-
ennaya komanda eval. Naprimer, esli znacheniem makropere-
mennoj X yavlyaetsya stroka $y, a makroperemennoj y - pqr,
to komanda
eval echo $X
vydast stroku pqr.
Rezul'taty vypolneniya komandy eval yavlyayutsya vhodnymi
dannymi dlya SHELL, kotoryj schityvaet ih i vypolnyaet v
kachestve komand. Takim obrazom, konstrukciya
wg='eval who | grep'
$wg fred
ekvivalentna komande
who | grep fred
- 26 -
V etom primere bez komandy eval ne obojtis', tak kak
metasimvol | pri posleduyushchej makropodstanovke ne
interpretiruetsya.
- Interpretaciya simvolov-razdelitelej.
Simvoly, poluchennye v rezul'tate vypolneniya ukazannyh
vyshe podstanovok, razbivayutsya zatem na slova, ne soder-
zhashchie razdelitelej. Probelami zdes' nazvany simvoly,
yavlyayushchiesya razdelitelyami slov. Spisok etih simvolov
soderzhitsya v makroperemennoj IFS; po umolchaniyu k nim
otnosyatsya probel, simvoly gorizontal'noj tabulyacii i
novoj stroki. Esli special'noe znachenie probela otme-
nit' odnim iz sushchestvuyushchih sposobov, to on budet
interpretirovat'sya sootvetstvuyushchej posledovatel'nost'yu
simvolov. Naprimer, komanda
echo ''
budet vydavat' pustuyu stroku, poskol'ku ona yavlyaetsya
pervym argumentom komandy echo, v to vremya kak vyzov
komandy
echo $null
budet osushchestvlyat'sya bez argumentov, esli znachenie mak-
roperemennoj null ne opredeleno ili opredeleno kak
pustaya stroka.
- Zadanie imen fajlov.
Na etom etape v slovah osushchestvlyaetsya poisk simvolov *,
? i [...] (yavlyayushchihsya obrazcami imen fajlov) i zamena
kazhdogo slova spiskom imen fajlov, raspolozhennyh v
alfavitnom poryadke. Kazhdoe imya fajla rassmatrivaetsya
kak otdel'nyj parametr.
Nad slovami, soderzhashchimisya v operatore cikla for,
vypolnyayutsya vse perechislennye dejstviya. V opreratore case
vypolnyaetsya tol'ko podstanovka znacheniya parametra, ukazyvae-
mogo posle klyuchevogo slova case.
Kak otmechalos', v yazyke SHELL sushchestvuyut tri mehanizma
ekranirovaniya metasimvolov (s ispol'zovaniem simvolov \,
'...' i "..."). Vnutri strok, zaklyuchennyh v dvojnye kavychki,
vypolnyayutsya tol'ko podstanovki znachenij parametrov i rezul'-
tatov vypolneniya komand. Dalee perechisleny simvoly, kotorye
pri zaklyuchenii ih v dvojnye kavychki ne teryayut svoego speci-
al'nogo znacheniya:
- 27 -
$ podstanovka znachenij parametrov;
` podstanovka rezul'tatov vypolneniya komand;
ogranichitel' ekraniruemoj stroki;
\ ekraniruet metasimvoly $, `, " i \.
Naprimer, v komande
echo $h
znachenie makroperemennoj x yavlyaetsya edinstvennym argumentom.
Analogichno, v komande
echo $*
vse pozicionnye parametry rassmatrivayutsya v kachestve edinst-
vennogo argumenta; eta komanda ekvivalentna sleduyushchej:
echo $1 $2 ...
Makrovyzovy $@ i $* identichny, za isklyucheniem sposobov ih
ekranirovaniya. Komandy
echo $@
i
echo $1 $2 ...
ekvivalentny. V rezul'tate ih vypolneniya budut vydavat'sya
znacheniya vseh pozicionnyh parametrov.
Na risunke 1 pokazano vozdejstvie mehanizmov ekraniro-
vaniya na kazhdyj iz metasimvolov yazyka SHELL.
Metasimvoly
$ * ` " '
-|------------------|
' | - - - - - t |
` | + - - t - - |
" | + + - + t - |
_|__________________|
+ metasimvol ekraniruetsya;
- metasimvol ne ekraniruetsya;
t ogranichitel' ekraniruemoj stroki.
Ris.1
- 28 -
4.1. Peredacha parametrov
Kak pozicionnye, tak i klyuchevye parametry mogut byt'
polucheny v processe vyzova komandnogo fajla. Klyuchevye para-
metry, krome togo, mozhno sdelat' dostupnymi eshche odnim sposo-
bom: nuzhno yavno ukazat', chto oni vvodyatsya v sredu processa
(stanovyatsya makroperemennymi). Naprimer, komanda:
export USER BOX
ukazyvaet na to, chto takimi makroperemennymi yavlyayutsya USER i
BOX. Pri vyzove komandnogo fajla sozdayutsya kopii vseh mak-
roperemennyh. Izmenenie znachenij makroperemennyh ne vyzyvaet
ih modifikacii v porozhdayushchem processe. Komandnyj fajl ne
mozhet izmenit' sostoyanie porozhdayushchego processa bez yavnogo
vyzova so storony porozhdayushchego processa. (Isklyuchenie sos-
tavlyayut deskriptory raspredelennyh fajlov).
Imena makroperemennyh, imeyushchih postoyannye znacheniya,
mogut zadavat'sya s pomoshch'yu komandy readonly (tol'ko dlya chte-
niya). Format etoj komandy sovpadaet s formatom komandy
export:
readonly imya...
Posle vypolneniya etoj komandy znacheniya perechislennyh makro-
peremennyh bol'she izmenit' nel'zya.
4.2. Podstanovka znachenij parametrov
Esli parametru yazyka SHELL ne bylo prisvoeno znachenie,
to on opredelyaetsya kak pustaya stroka. Pri vypolnenii
komandy
echo ${d-.}
vydaetsya znachenie makroperemennoj d, esli ona opredelena,
ili simvol '.' - v protivnom sluchae. V komande echo ispol'-
zuyutsya obychnye soglasheniya ob otmene special'nyh znachenij
metasimvolov. Sledovatel'no, esli znachenie makroperemennoj d
ne bylo opredeleno, to komanda
echo ${d-'*'}
vyvedet simvol *. Analogichno, komanda
echo ${d-$X}
esli makroperemennaya d opredelena, vydast ee znachenie, esli
net - znachenie makroperemennoj X.
Znachenie po umolchaniyu makroperemennoj mozhet byt' opre-
deleno sleduyushchim obrazom:
- 29 -
echo ${d=.}
esli makroperemennaya d ne opredelena, ej prisvaivaetsya sim-
vol '.' (dlya pozicionnyh parametrov oboznachenie ${...=...}
ispol'zovat' nel'zya).
Komanda
echo ${d?soobshchenie}
vydaet znachenie makroperemennoj d, esli ono opredeleno, i
soobshchenie - esli ne opredeleno. V poslednem sluchae vypolne-
nie komandnogo fajla zavershaetsya. Esli soobshchenie otsutst-
vuet, to vydaetsya standartnaya diagnostika interpretatora.
Komandnyj fajl, chast' parametrov kotorogo dolzhna imet' opre-
delennye znacheniya, mozhet nachinat'sya sleduyushchim obrazom:
: ${USER?} ${HOME?} ${BIN?}
...
Dvoetochie : predstavlyaet soboj vstroennuyu komandu yazyka
SHELL, prednaznachennuyu dlya ocenki znachenij svoih parametrov.
Esli znachenie hotya by odnoj iz peremennyh USER, HOME ili BIN
ne opredeleno, vydaetsya diagnostika i vypolnenie komandnogo
fajla prekrashchaetsya.
4.3. Podstanovka rezul'tatov vypolneniya komand
V yazyke SHELL sushchestvuet vozmozhnost' ispol'zovaniya
rezul'tata vypolneniya komand v razlichnyh celyah. Tak, stan-
dartnym vyhodom komandy pwd yavlyaetsya imya tekushchego spravoch-
nika, i esli takim spravochnikom yavlyaetsya, naprimer,
/usr/nata/bin, to komanda
d=`pwd`
budet ekvivalentna komande
d=/usr/nata/bin
Stroka, zaklyuchennaya mezhdu obratnymi kavychkami `...`, vospri-
nimaetsya kak komanda i zamenyaetsya rezul'tatom vypolneniya
etoj komandy. Komandy zapisyvayutsya s ispol'zovaniem obychnyh
soglashenij ob otmene special'nyh znachenij metasimvolov, za
isklyucheniem togo, chto special'noe znachenie simvola obratnoj
kavychki "`" otmenyaetsya simvolom \. Naprimer, komanda
ls `echo $1`
ekvivalentna komande
ls $1
- 30 -
Vezde, gde razreshena podstanovka znachenij parametrov,
mozhet proizvodit'sya i podstanovka rezul'tatov vypolneniya
komand (v tom chisle i v lokal'nyh fajlah). Obrabotka rezul'-
tatov v oboih sluchayah vypolnyaetsya odinakovo. |to pozvolyaet
ispol'zovat' v procedurah yazyka SHELL komandy, prednaznachen-
nye dlya obrabotki strok. Primerom takoj komandy yavlyaetsya
komanda basename, kotoraya udalyaet iz slova ukazannyj suf-
fiks. Naprimer, v rezul'tate vypolneniya komandy
basename main.c .c
budet poluchena posledovatel'nost' simvolov main. Ispol'zova-
nie komandy basename mozhno proillyustrirovat' sleduyushchim frag-
mentom komandy cc:
case $A in
...
*.c) B=`basename $A .c`
...
esac
V etom primere makroperemennoj B prisvaivaetsya znachenie mak-
roperemennoj A, iz kotoroj udalen suffiks .c.
4.4. Obrabotka oshibok
Dejstviya interpretatora pri obnaruzhenii oshibki zavisyat
ot dvuh obstoyatel'stv: tipa oshibki i rezhima raboty interpre-
tatora. Rezhim raboty interpretatora schitaetsya interaktivnym
v tom sluchae, esli vvod/vyvod informacii osushchestvlyaetsya s
terminala ili interpretator vyzvan s klyuchom -i.
Privedem spisok prichin, kotorye privodyat k oshibkam pri
vypolnenii komandy:
- nevernoe ukazanie fajlov vvoda/vyvoda (naprimer, fajl
ne sushchestvuet ili ne mozhet byt' sozdan);
- samoj komandy ne sushchestvuet, ili ona ne mozhet byt'
vypolnena;
- komanda vyzvalas' normal'no, no ee kod zaversheniya
imeet nenulevoe znachenie.
Esli interpretator rabotaet v interaktivnom rezhime, to,
nezavisimo ot rezul'tata zaversheniya predydushchej komandy, on
perehodit k vypolneniyu sleduyushchej.
V ne interaktivnom rezhime dva vida oshibok privodyat k
prekrashcheniyu obrabotki komandnogo fajla:
- sintaksicheskaya oshibka v operatorah upravleniya (while,
until, if, for);
- 31 -
- oshibka pri vypolnenii vstroennoj komandy.
Dlya togo chtoby obespechit' prekrashchenie vypolneniya
komandy pri obnaruzhenii lyuboj iz ukazannyh oshibok, pri
vyzove interpretatora neobhodimo ispol'zovat' klyuch -e.
4.5. Obrabotka preryvanij
Signaly, vyzyvayushchie preryvanie vypolneniya komandy,
perechisleny v tabl.1.
V zavisimosti ot svoego rezhima raboty, pri poluchenii
signala interpretator postupaet sleduyushchim obrazom. Esli
rezhim raboty - interaktivnyj, to (takzhe kak i pri obnaruzhe-
nii oshibki) zavershiv vypolnenie tekushchej komandy, on perejdet
k vypolneniyu sleduyushchej. Esli zhe rezhim - neinteraktivnyj,
interpretator zavershit vypolnenie tekushchej komandy, posle
chego libo prekratit rabotu, libo vozvratitsya v interaktivnyj
rezhim.
Tablica 1
Signaly sistemy DEMOS
------------------------------------------------------------
Signal Opisanie
------------------------------------------------------------
0 vyhod iz interpretatora (po lyuboj prichine, vklyuchaya
dostizhenie konca fajla)
1 zavisanie
2 preryvanie
3* vyhod (CTRL/Q sozdaetsya fajl core, soderzhashchij kopiyu
operativnoj pamyati processa)
4* zapreshchennaya komanda (ne sbrasyvaetsya posle priema)
5* ispol'zovanie komandy BPT (preryvanie trassirovki)
6* ispol'zovanie komandy preryvaniya vvoda/vyvoda IOT
7* ispol'zovanie komandy EMT
8* oshibka operacii s plavayushchej tochkoj
9 unichtozhit' process (ne mozhet byt' perehvachen ili pro-
ignorirovan)
10* oshibka shiny
11* narushenie zashchity pamyati
12* nepravil'nyj parametr v sistemnom vyzove
13 zapis' po kanalu mezhprocessnoj svyazi pri otsutstvii
chteniya processom-poluchatelem
14 preryvanie po zadannomu vremeni
15 preryvanie programmy (po komande kill)
16 ne ispol'zuetsya
------------------------------------------------------------
Komandy, otmechennye znakom *, osushchestvlyayut kopirovanie
operativnoj pamyati processa. Odnako, sam interpretator igno-
riruet eti signaly.
- 32 -
Pri postuplenii signala preryvaniya vypolnyayutsya nekoto-
rye standartnye dejstviya, posle chego obraboka komandnogo
fajla obychno zavershaetsya. Esli eto po tem ili inym prichinam
ne ustraivaet pol'zovatelya, on mozhet zadat' svoi metody
reakcii na opredelennye tipy preryvanij. Dlya etoj celi v
yazyke SHELL primenyaetsya vstroennaya komanda trap. Naprimer,
komanda
trap 'rm /tmp/ps$$; exit' 2
perehvatyvaet signal 2 (preryvanie) i vypolnyaet komandu
rm /tmp/ps$$; exit
Vstroennaya komanda exit preryvaet vypolnenie komandnogo
fajla.
Sushchestvuet tri sposoba obrabotki signalov:
1. Signaly ignoriruyutsya (v etom sluchae signal voobshche ne
posylaetsya processu).
2. Signaly perehvatyvayutsya (reakciya na signal obespechivaetsya
samim processom).
3. Signaly propuskayutsya bez obrabotki. Rabota processa
zavershaetsya.
Esli pri vhode v komandnyj fajl signal ignoriruetsya, to
ignoriruetsya i komanda trap.
Esli argumentom komandy trap yavlyaetsya pustaya stroka, to
procedura ignoriruet signaly. V kachestve primera mozhno pri-
vesti fragment komandy nohup:
trap '' 1 2 3 15
posle vypolneniya kotorogo kak procedura, tak i vyzyvayushchie ee
komandy budut ignorirovat' perechislennye signaly.
Standartnaya reakciya na signaly mozhet byt' vosstanov-
lena, naprimer, sleduyushchej komandoj:
trap 2 3
Spisok tekushchih znachenij signalov sistemy mozhet byt' poluchen
s pomoshch'yu komandy
trap
Eshche odnim primerom ispol'zovaniya komandy trap (bez pos-
leduyushchego vyhoda iz komandnogo fajla) yavlyaetsya procedura
- 33 -
scan, kotoraya osushchestvlyaet prosmotr podspravochnikov v teku-
shchem spravochnike i vypolnenie komand, vvodimyh s terminala,
do polucheniya signala konec_fajla ili preryvanie. Signal
preryvanie dejstvuet tol'ko po okonchanii vypolneniya komandy.
Tekst procedury scan imeet sleduyushchij vid:
for i in *
do if test -d $d/$i
then cd $d/$i
while echo $i:
trap exit 2
read x
do trap : 2; eval $x; done
fi
done
Vstroennaya komanda read x schityvaet stroki iz fajla stan-
dartnogo vvoda i prisvaivaet rezul'tat ih vypolneniya makro-
peremennoj x. Signaly konec_fajla ili preryvanie prekrashchayut
vypolnenie etoj komandy s kodom zaversheniya, ne ravnym nulyu.
5. VYZOV INTERPRETATORA
Vsled za registraciej pol'zovatelya v sisteme (s pomoshch'yu
komandy login) vyzyvaetsya interpretator yazyka SHELL. Esli
registracionnyj spravochnik pol'zovatelya soderzhit fajl .pro-
file, to prezhde chem s terminala budet prinyata hotya by odna
komanda, interpretator vypolnyaet etot fajl (podrazumevaetsya,
chto fajl .profile soderzhit komandy).
Pri vyzove mogut ukazyvat'sya sleduyushchie klyuchi:
-c stroka
Komandy schityvayutsya iz zadannoj stroki.
-s Komandy chitayutsya iz standartnogo fajla vvoda. Soobshche-
niya interpretatora zapisyvayutsya v standartnyj fajl
diagnostik.
-i Interaktivnyj rezhim raboty.
Esli pervym simvolom parametra "0" yavlyaetsya znak -, to
komandy schityvayutsya iz fajla .profile.
6. SVODKA OSNOVNYH KONSTRUKCIJ YAZYKA SHELL
- 34 -
Tablica 2
SPECIALXNYE SIMVOLY
------------------------------------------------------------
Simvol Opisanie
------------------------------------------------------------
# komentarij;
| sozdat' kanal svyazi processov;
~ sozdat' kanal svyazi processov;
; razdelitel' komand;
& zapustit' sleduyushchij process, ne ozhidaya okonchaniya pre-
dydushchego;
&& vypolnit' sleduyushchuyu komandu, esli kod zaversheniya pre-
dydushchej raven nulyu;
|| vypolnit' sleduyushchuyu komandu, esli kod zaversheniya pre-
dydushchej ne raven nulyu;
'...' literal'naya konstanta;
"..." posle podstanovki znachenij makroperemennyh, stroka
rassmatrivaetsya kak literal'naya konstanta;
\ otmenyaet special'noe znachenie sleduyushchego za nim sim-
vola.
------------------------------------------------------------
Tablica 3
VVOD-VYVOD
------------------------------------------------------------
Konstrukciya Opisanie
------------------------------------------------------------
[d]<< sleduyushchij parametr yavlyaetsya imenem fajla, koto-
ryj ispol'zuetsya v kachestve standartnogo fajla
vvoda s deskriptorom d (po umolchaniyu d=0);
[d]>> sleduyushchij parametr yavlyaetsya imenem fajla, koto-
ryj ispol'zuetsya v kachestve standartnogo fajla
vyvoda s deskriptorom d (po umolchaniyu d=1);
[d]>>>> to zhe chto >>, za isklyucheniem togo, chto vyvodimaya
informaciya dopisyvaetsya k koncu soderzhimogo
fajla;
[d]<<<< vvod osushchestvlyaetsya do teh por, poka ne vstre-
chaetsya posledovatel'nost' simvolov, stoyashchaya za
dannoj konstrukciej;
[d]<<&cifra v kachestve standartnyj fajla vvoda ispol'zuetsya
fajl s deskriptorom cifra;
[d]>>&cifra v kachestve fajla standartnogo vyvoda ispol'zu-
etsya fajl s deskriptorom cifra;
[d]<<&- zakryt' standartnyj fajl vvoda;
[d]<<>> otkryt' ukazannyj fajl dlya chteniya (zapisi).
------------------------------------------------------------
- 35 -
Tablica 4
ZADANIE IMEN FAJLOV
------------------------------------------------------------
Konstrukciya Opisanie
------------------------------------------------------------
? sootvetstvuet odinochnomu simvolu;
* sootvetstvuet stroke simvolov (v t.ch. pustoj);
[...] sootvetstvuet odnomu iz perechislennyh simvolov;
para simvolov, razdelennaya znakom -, sootvetst-
vuet lyubomu simvolu iz ukazannogo promezhutka;
------------------------------------------------------------
Tablica 5
PODSTANOVKA ZNACHENIJ PARAMETROV
------------------------------------------------------------
Konstrukciya Opisanie
------------------------------------------------------------
$n zamenit' $n znacheniem n;
$* "1 2 ..."
$@ "1" "2" ...
$# chislo pozicionnyh parametrov;
$- klyuchi, kotorye vvodyatsya pri vyzove ili s
pomoshch'yu komandy set;
$? kod zaversheniya poslednej komandy;
$$ nomer tekushchego processa;
$! nomer processa poslednej fonovoj komandy;
imya=znachenie opredelenie makroperemennoj;
${imya-slovo} esli imya opredeleno, podstavit' znachenie,
inache - slovo;
${imya=slovo} ispol'zovat' znachenie imeni; esli ne oprede-
leno - prisvoit' i ispol'zovat' znachenie
slovo;
${imya?slovo} ispol'zovat' znachenie imeni, esli opredeleno,
inache - napechatat' slovo i prekratit' vypolne-
nie komandnogo fajla;
${imya+slovo} ispol'zovat' slovo, esli imya opredeleno, inache
- nichego ne delat';
$HOME imya spravochnika dlya komandy cd bez parametrov;
$PATH spisok imen spravochnikov dlya poiska komand;
$MAIL fajl dlya priema pochty;
$PS1 podskazka interpretatora (po umolchaniyu $);
$PS2 podskazka interpretatora dlya prodolzhenii vvoda
komandy (po umolchaniyu >>);
$IFS razdeliteli slov komandnoj stroki (po umolcha-
niyu probel, znak tabulyacii i novoj stroki);
------------------------------------------------------------
- 36 -
Prodolzhenie tablicy 5
------------------------------------------------------------
Konstrukciya Opisanie
------------------------------------------------------------
$TERM tip terminala.
------------------------------------------------------------
- 37 -
KOMANDNYJ YAZYK
for imya [in slovo...]
do spisok_komand
done
case slovo in
[obr1 [|obr2]...) spisok_komand;;]
...
esac
if spisok_komand
then spisok_komand
[elif spisok_komand then spisok_komand]
[else spisok_komand]
fi
while spisok_komand
[do spisok_komand]
done
until spisok_komand
[do spisok_komand]
done
(spisok_komand)
{ spisok_komand; }
break [n]
vyhod iz ciklov for, case, while ili until na urovne n;
continue
perehod k sleduyushchej iteracii cikla for, while ili
until;
exit [N]
vyhod s kodom zaversheniya N;
: ne proizvodit nikakih dejstvij, za isklyucheniem podsta-
novki znachenij makroperemennyh.
- 38 -
VSTROENNYE KOMANDY
. fajl
vypolnit' komandnyj fajl v ramkah tekushchego processa;
eval [komanda ...]
provesti vse makropodstanovki i vypolnit' "komandu
...";
exec [komanda ...]
tekushchij process zamenit' processom vypolneniya komandy
...;
export [imya ...]
kopirovat' opredelenie makroperemennoj imya v sredu
porozhdaemyh processov;
read imya ...
schitat' fajl standartnogo vvoda i prisvoit' znachenie
makroperemennoj imya;
readonly [imya ...]
zapretit' pereopredelenie makroperemenoj;
set [-ekntuvx [par ...]]
ustanovit' rezhimy raboty interpretatora (znacheniya klyu-
chej sm. v opisanii komandy sh);
shift
pereimenovat' pozicionnye parametry; 1=2 ...;
times
vydat' vremya, zatrachennoe na vypolnenie processa;
trap [komanda] [n]
vypolnit' komandu, esli poluchen signal n;
umask [nnn]
maska sozdaniya fajla - obratnyj kod (v vos'merichnoj
sisteme);
wait [pid]
ozhidat' okonchaniya processa s nomerom pid.
- 39 -
SODERZHANIE
ANNOTACIYA ......................................... 2
1. VVEDENIE .......................................... 3
2. OSNOVNYE PONYATIYA .................................. 3
2.1. Prostye komandy ................................. 4
2.2. Fonovye processy ................................ 4
2.3. Zadanie imen fajlov ............................. 4
2.4. Otmena special'nogo znacheniya metasimvolov ....... 6
2.5. Zadanie fajlov vvoda/vyvoda ..................... 6
2.6. Svyaz' processov, konvejery i fil'try ............ 8
2.7. Makroperemennye ................................. 9
2.8. Vydacha podskazok ................................ 12
2.9. Sostavnye komandy ............................... 12
2.10. Vstroennye komandy .............................. 12
3. KOMANDNYE FAJLY ................................... 15
3.1. Kommentarii ..................................... 17
3.2. Komanda test .................................... 17
3.3. Operator for .................................... 18
3.4. Operator case ................................... 19
3.5. Operatory while i until ......................... 21
3.6. Operatory break i continue ...................... 22
3.7. Operator if ..................................... 22
3.8. Lokal'nyj fajl .................................. 24
3.9. Otladka komandnyh fajlov ........................ 25
4. PARAMETRY I OBLASTX DEJSTVIYA MAKROPEREMENNYH ...... 25
4.1. Peredacha parametrov ............................. 29
4.2. Podstanovka znachenij parametrov ................. 29
4.3. Podstanovka rezul'tatov vypolneniya komand ....... 30
4.4. Obrabotka oshibok ................................ 31
4.5. Obrabotka preryvanij ............................ 32
5. VYZOV INTERPRETATORA .............................. 34
6. SVODKA OSNOVNYH KONSTRUKCIJ YAZYKA SHELL ........... 34
- 40 -
Last-modified: Mon, 29 Jun 1998 14:15:05 GMT