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 >> 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 ...