Interpretator komandnogo yazyka shell
Shell - komandnyj yazyk, mogushchij vypolnyat' kak komandy,
vvedennye s terminala, tak i komandy, hranyashchiesya v fajle.
|tot tekst podgotovlen NPO "KLOTO"
Oglavlenie
1. Osnovnye ponyatiya yazyka shell . . . . . . . . . . . . . .
1_1. Vvod-vyvod . . . . . . . . . . . . . . . . . . . . . .
1_2. Sinhronnoe i asinhronnoe vypolnenie komand . . . . . .
1_3. Konvejer . . . . . . . . . . . . . . . . . . . . . . .
1_4. Metasimvoly, generaciya imen fajlov . . . . . . . . . .
2_ Sintaksis yazyka shell . . . . . . . . . . . . . . . . .
2_1. Kommentarii . . . . . . . . . . . . . . . . . . . . .
2_2. Podstanovka rezul'tatov vypolneniya komand . . . . . .
2_3. Peremennye i podstanovka ih znachenij . . . . . . . . .
2_4. Special'nye peremennye . . . . . . . . . . . . . . . .
3_ Upravlyayushchie konstrukcii . . . . . . . . . . . . . . . .
3_1. Cikl DLYA . . . . . . . . . . . . . . . . . . . . . . .
3_2. Operator vybora . . . . . . . . . . . . . . . . . . .
3_3. Uslovnyj operator . . . . . . . . . . . . . . . . . .
3_4. Cikl POKA . . . . . . . . . . . . . . . . . . . . . .
3_5. Funkcii . . . . . . . . . . . . . . . . . . . . . . .
3_6. Zarezervirovannye slova . . . . . . . . . . . . . . .
3_7. Special'nye komandy . . . . . . . . . . . . . . . . .
4_ Vypolnenie shell-programm . . . . . . . . . . . . . . .
4_1. Zapusk shella . . . . . . . . . . . . . . . . . . . .
4_2. Vypolnenie . . . . . . . . . . . . . . . . . . . . . .
4_3. Okruzhenie . . . . . . . . . . . . . . . . . . . . . .
4_4. Signaly . . . . . . . . . . . . . . . . . . . . . . .
4_5. Zamechaniya . . . . . . . . . . . . . . . . . . . . . .
5_ Dopolnitel'nye svedeniya . . . . . . . . . . . . . . . .
5_1. Komanda test . . . . . . . . . . . . . . . . . . . . .
5_2. Komanda expr . . . . . . . . . . . . . . . . . . . . .
5_3. Komanda ena . . . . . . . . . . . . . . . . . . . . .
* 1. Osnovnye ponyatiya yazyka shell *
Tri napravleniya vvoda-vyvoda yavlyayutsya vydelennymi - stan-
dartnyj vvod, standartnyj vyvod i standartnyj protokol. Kak
pravilo, komandy berut ishodnye dannye iz standartnogo vvoda i
pomeshchayut rezul'taty v standartnyj vyvod.
Standartnye vvod, vyvod i protokol mozhno perenaznachit'.
Oboznachenie
<
sluzhit dlya perenaznacheniya standartnogo vvoda (deskriptor fajla
0),
>
dlya standartnogo vyvoda (deskriptor fajla 1);
<<
vvod proishodit so standartnogo vvoda, poka ne vstretitsya uka-
zannaya ili konec fajla,
>>
dlya standartnogo vyvoda; esli fajl sushchestvuet, to vyvodimaya in-
formaciya dobavlyaetsya k konec etogo fajla,
<&
v kachestve standartnogo vvoda ob®yavlyaetsya fajl, associirovannyj
s deskriptorom ; analogichno dlya standartnogo vyvoda
>&
<&- i >&-
zakryvayut sootvetstvenno standartnyj vvod i vyvod.
Esli lyuboj iz etih konstrukcij predshestvuet cifra, to s
ukazannym fajlom budet associirovan deskriptor, ravnyj ukazan-
noj cifre, vmesto 0 i 1 po umolchaniyu. Naprimer,
2 >
dlya standartnogo protokola ispol'zuetsya deskriptor 2, a
2 >& 1
associiruet deskriptor 2 s fajlom, associirovannym s deskripto-
rom 1.
... 2>protocol
perenaznachaet standartnyj protokol (deskriptor 2) v fajl po
imeni protocol.
CHtoby perenaznachit' standartnyj protokol tuda zhe, kuda uzhe naz-
nachen standartnyj vyvod, sleduet upotrebit' konstrukciyu
”... 2>&1
Vazhen poryadok perenaznacheniya: shell proizvodit perenazna-
chenie sleva napravo po ukazannomu spisku. Tak,
1 > xxx 2 >& 1
snachala associiruet deskriptor 1 s fajlom xxx, a zatem deskrip-
tor 2 s 1, t.e. tozhe s xxx. A
2 >& 1 1 > xxx
associiruet deskriptor 2 s terminalom, a 1 - s fajlom xxx.
Mozhno perenaznachit' sistemnyj vvod na tekushchij fajl:
isql - - <1_2. Sinhronnoe i asinhronnoe vypolnenie komand
Obychno shell zhdet zaversheniya vypolneniya komandy. Odnako
imeetsya vozmozhnost' zapustit' zadachu v asinhronnom rezhime, t.e.
bez ozhidaniya ee zaversheniya. Dlya etogo posle komandy (posle vseh
ee argumentov i ukazanij o perenaznachenii vvoda-vyvoda) nado
postavit' znak &. Pri etom po umolchaniyu standartnyj vvod koman-
dy naznachaetsya na pustoj fajl /dev/null.
Primer: sozdat' fajl primer mozhno po komande
echo > primer
Eshche primer: zapustit' programmu prog v asinhronnom rezhime, chto-
by ne nado bylo dozhidat'sya ego zaversheniya, zasech' vremya vypol-
neniya, rezul'taty programmy napravit' v fajl prog.res, dannye o
vremeni vypolneniya - v fajl prog.tim.
time prog > prog.res 2> prog.tim &
Konvejer - posledovatel'nost' komand, razdelennyh znakom |.
Esli posle konvejera stoit ; shell zhdet ego zaversheniya. Esli &
- to ne zhdet. Rol' ; mozhet igrat' konec stroki. Smysl konvejera
v tom, chto standartnyj vyvod odnoj komandy zamykaetsya na stan-
dartnyj vvod drugoj. Primer konvejera - podschitat' chislo ob®-
ektnyh fajlov v tekushchem kataloge.
ls *.o | wc -l
1_4. Metasimvoly, generaciya imen fajlov
Metasimvoly - simvoly, imeyushchie special'noe znachenie dlya
interpretatora :
? * ; & ( ) | ^ < >
Odnako kazhdyj iz etih simvolov mozhet predstavlyat' samogo sebya,
esli pered nim stoit \. Vse simvoly, zaklyuchennye mezhdu kavychka-
mi ' i ', predstavlyayut samih sebya. Mezhdu dvojnymi kavychkami (")
vypolnyayutsya podstanovki komand (sm p. 2.2) i parametrov (sm. p.
2.3), a simvoly \, `," i $ mogut ekranirovat'sya predshestvuyushchim
simvolom \.
Posle vseh podstanovok v kazhdom slove komandy ishchutsya sim-
voly *,?, i [. Esli nahoditsya hotya by odin iz nih, to eto slovo
rassmatrivaetsya kak shablon imen fajlov i zamenyaetsya imenami
fajlov, udovletvoryayushchih dannomu shablonu (v alfavitnom poryadke).
Esli ni odno imya fajla ne udovletvoryaet shablonu, to on ostaetsya
neizmennym. Znacheniya ukazannyh simvolov:
* lyubaya stroka, vklyuchaya i pustuyu
? odin lyuboj simvol
[...] lyuboj iz ukazannyh mezhdu nimi simvolov. Para
simvolov, razdelennyh znakom -, oznachaet lyuboj
simvol, kotoryj nahoditsya mezhdu nimi, vklyuchaya i
ih samih. Esli pervym simvolom posle "[" idet
"!", to ukazannye simvoly ne dolzhny vhodit' v
imya fajla
* 2_ Sintaksis yazyka shell *
Stroki, nachinayushchiesya s #, traktuyutsya kak kommentarii.
2_2. Podstanovka rezul'tatov vypolneniya komand
Vyrazheniya mozhno zaklyuchat' v obratnye kavychki (`). Takie
vyrazheniya vychislyayutsya v meste ispol'zovaniya. Oni mogut byt',
naprimer, chast'yu strok. Primer. Pust' parametrom makrokomandy
yavlyaetsya imya fajla s rasshireniem .for. Trebuetsya udalit' odnoi-
mennyj fajl s rasshireniem .err.
name=`ena -n $1`
rm -f ${name}.err
Znachenie, poluchennoe v rezul'tate vypolneniya komandy
ena -n $1
prisvaivaetsya peremennoj name. Figurnye skobki ispol'zovany dlya
vydeleniya argumenta operacii perehoda ot imeni k znacheniyu. Bez
nih .err prikleilas' by k imeni.
2_3. Peremennye i podstanovka ih znachenij
Vse peremennye v yazyke shell - tekstovye. Ih imena dolzhny
nachinat'sya s bukvy i sostoyat' iz latinskih bukv, cifr i znaka
podcherkivaniya (_). CHtoby vospol'zovatsya znacheniem peremennoj,
nado pered nej postavit' simvol $. Ispol'zovanie znacheniya pere-
mennoj nazyvaetsya podstanovkoj.
Razlichaetsya dva klassa peremennyh: pozicionnye i s imenem.
Pozicionnye peremennye - eto argumenty komandnyh fajlov, ih
imenami sluzhat cifry: $0 - imya komandy, $1 - pervyj argument i
t.d. Znacheniya pozicionnym peremennym mogut byt' prisvoeny i ko-
mandoj set (sm. Special'nye komandy). Primer. Posle vyzova
programmy na shelle, hranyashchejsya v fajle ficofl:
ficofl -d / \*.for
znacheniem $0 budet ficofl, $1 - -d, $2 - /, $3 - *.for, znache-
niya ostal'nyh pozicionnyh peremennyh budut pustymi strokami.
Zametim, chto esli by simvol * pri vyzove ficofl ne byl ekrani-
rovan, v kachestve argumentov peredalis' by imena vseh fortran-
nyh fajlov tekushchej direktorii.
Eshche dve peremennye hranyat komandnuyu stroku za isklyucheniem
imeni komandy: $@ ekvivalentno $1 $2 ..., a $* - "$1 $2 ...".
Nachal'nye znacheniya peremennym s imenem mogut byt' ustanov-
leny sleduyushchim obrazom:
= [ = ] ...
Ne mozhet byt' odnovremenno funkcii (sm. Upravlyayushchie konstruk-
cii) i peremennoj s odinakovymi imenami.
Dlya podstanovki znachenij peremennyh vozmozhny takzhe sleduyu-
shchie konstrukcii:
${}
esli znachenie opredeleno, to ono podstavlyaetsya.
Skobki primenyayutsya lish' esli za sleduet simvol,
kotoryj bez skobok prikleitsya k imeni.
${:-}
esli opredelena i ne yavlyaetsya pustoj strokoj, to
podstavlyaetsya ee znachenie; inache podstavlyaetsya .
${:=}
esli ne opredelena ili yavlyaetsya pustoj strokoj, ej
prisvaivaetsya znachenie ; posle etogo podstavlyaetsya ee
znachenie.
${:?}
esli opredelena i ne yavlyaetsya pustoj strokoj, to
podstavlyaetsya ee znachenie; inache na standartnyj vyvod vyvoditsya
i vypolnenie shella zavershaetsya. Esli opushcheno,
to vydaetsya soobshchenie "parameter null or not set".
${:+}
esli opredelena i ne yavlyaetsya pustoj strokoj, to
podstavlyaetsya ; inache podstavlyaetsya pustaya stroka.
Primer: esli peremennaya d ne opredelena ili yavlyaetsya pus-
toj strokoj, to vypolnyaetsya komanda pwd
echo ${d:-`pwd`}
Sleduyushchie peremennye avtomaticheski ustanavlivayutsya shellom:
# kolichestvo pozicionnyh parametrov (desyatichnoe)
- flagi, ukazannye pri zapuske shella ili koman-
doj set
? desyatichnoe znachenie, vozvrashchennoe predydushchej
sinhronno vypolnennoj komandoj
$ nomer tekushchego processa
! nomer poslednego asinhronnogo processa
@ ekvivalentno $1 $2 $3 ...
* ekvivalentno "$1 $2 $3 ..."
Napomnim: chtoby poluchit' znacheniya etih peremennyh, pered nimi
nuzhno postavit' znak $. Primer: vydat' nomer tekushchego processa:
echo $$
2_4. Special'nye peremennye
Shellom ispol'zuyutsya sleduyushchie special'nye peremennye:
HOME direktoriya, v kotoruyu pol'zovatel' popadaet pri
vhode v sistemu ili pri vypolnenii komandy cd
bez argumentov
PATH spisok polnyh imen katalogov, v kotoryh ishchetsya
fajl pri ukazanii ego nepolnogo imeni.
PS1 osnovnaya stroka priglasheniya (po umolchaniyu $)
PS2 dopolnitel'naya stroka priglasheniya (po umolchaniyu
>); v interaktivnom rezhime pered vvodom komandy
shellom vyvoditsya osnovnaya stroka priglasheniya.
Esli nazhata klavisha new_line, no dlya zaversheniya
komandy trebuetsya dal'nejshij vvod, to vyvoditsya
dopolnitel'naya stroka priglasheniya
IFS posledovatel'nost' simvolov, yavlyayushchihsya razde-
litelyami v komandnoj stroke (po umolchaniyu eto
, i )
* 3_ Upravlyayushchie konstrukcii *
Prostaya komanda - eto posledovatel'nost' slov, razdelennaya
probelami. Pervoe slovo yavlyaetsya imenem komandy, kotoraya budet
vypolnyat'sya, a ostal'nye budut peredany ej kak argumenty. Imya
komandy peredaetsya ej kak argument nomer 0 (t.e. imya komandy
yavlyaetsya znacheniem $0). Znachenie, vozvrashchaemoe prostoj komandoj
- eto ee status zaversheniya, esli ona zavershilas' normal'no, ili
(vos'merichnoe) 200+status, esli ona zavershilas' avarijno.
Spisok - eto posledovatel'nost' odnogo ili neskol'kih kon-
vejerov, razdelennyh simvolami ;, &, && ili || i byt' mozhet za-
kanchivayushchayasya simvolom ; ili &. Iz chetyreh ukazannyh operacij ;
i & imeyut ravnye prioritety, men'shie, chem u && i ||. Prioritety
poslednih takzhe ravny mezhdu soboj. Simvol ; oznachaet, chto kon-
vejery budut vypolnyat'sya posledovatel'no, a & - parallel'no.
Operaciya && (||) oznachaet, chto spisok, sleduyushchij za nej budet
vypolnyat'sya lish' v tom sluchae, esli kod zaversheniya predydushchego
konvejera nulevoj (nenulevoj).
Komanda - eto libo prostaya komanda, libo odna iz upravlyayu-
shchih konstrukcij. Kodom zaversheniya komandy yavlyaetsya kod zavershe-
niya ee poslednej prostoj komandy.
for [ in ]
do
done
Esli chast' in opushchena, to eto oznachaet in "$@" ( to
est' in $1 $2 ... $n). Primer. Vyvesti na ekran vse fortrannye
fajly tekushchej biblioteki:
for f in *.for
do
cat $f
done
case $ in
| ... ) ;;
. . .
esac
Operator vybora vypolnyaet , sootvetstvuyushchij pervomu
, kotoromu udovletvoryaet . Forma shablona
ta zhe, chto i ispol'zuemaya dlya generacii imen fajlov. CHast'
| shablon... mozhet otsutstvovat'.
Primer. Opredelit' flagi i otkompilirovat' vse ukazannye fajly.
# inicializirovat' flag
flag=
# povtoryat' dlya kazhdogo argumenta
for a
do
case $a in
# ob®edinit' flagi, razdeliv ih probelami
-[ocSO]) flag=$flag' ' $a ;;
-*) echo 'unknown flag $a' ;;
# kompilirovat' kazhdyj ishodnyj fajl i sbrosit' flagi
*.c) cc $flag $a; flag= ;;
*.s) as $flag $a; flag= ;;
*.f) f77 $flag $a; flag= ;;
# nevernyj argument
*) echo 'unexpected argument $a' ;;
esac
done
if
then
[ elif
then
]
. . .
[ else
]
fi
Vypolnyaetsya i, esli kod ego zaversheniya 0, to vypolnya-
etsya , inache - i, esli i ego kod zaversheniya
0, to vypolnyaetsya . Esli zhe eto ne tak, to vypolnyaetsya
. CHasti elif i else mogut otsutstvovat'.
while
do
done
Do teh por, poka kod zaversheniya poslednej komandy
est' 0, vypolnyayutsya komandy .
Pri zamene sluzhebnogo slova while na until uslovie vyhoda
iz cikla menyaetsya na protivopolozhnoe.
V kachestve odnoj iz komand mozhet byt' komanda
true (false). Po etoj komande ne vypolnyaetsya nikakih dejstvij,
a kod zaversheniya ustanavlivaetsya 0 (-1). |ti komandy primenyayut-
sya dlya organizacii beskonechnyh ciklov. Vyhod iz takogo cikla
mozhno osushchestvit' lish' po komande break (sm. Special'nye koman-
dy).
() {
;
}
Opredelyaetsya funkciya s imenem . Telo funkcii - ,
zaklyuchennyj mezhdu { i }.
3_6. Zarezervirovannye slova
Sleduyushchie slova yavlyayutsya zarezervirovannymi:
if then else elif fi
case in esac
for while until do done
{ }
Kak pravilo, dlya vypolneniya kazhdoj komandy shell porozhdaet
otdel'nyj process. Special'nye komandy otlichayutsya tem, chto oni
vstroeny v shell i vypolnyayutsya v ramkah tekushchego processa.
: Pustaya komanda. Vozvrashchaet nulevoj kod zavershe-
niya.
. file Shell chitaet i vypolnyaet komandy iz fajla file,
zatem zavershaetsya; pri poiske file ispol'zuetsya
spisok poiska $PATH.
break [n] Vyhod iz vnutrennego for ili while cikla; esli
ukazano n, to vyhod iz n vnutrennih ciklov.
continue [n] Perejti k sleduyushchej iteracii vnutrennego for
ili while cikla; esli ukazano n, to perehod k
sleduyushchej iteracii n-ogo cikla.
cd [ ]
Smenit' tekushchuyu direktoriyu na direktoriyu . Po umolchaniyu ispol'zuetsya znachenie HOME.
echo [ ... ]
Vyvodit svoi argumenty v standartnyj vyvod,
razdelyaya ih probelami.
eval [ ... ]
Argumenty chitayutsya, kak esli by oni postupali
iz standartnogo vvoda i rassmatrivayutsya kak ko-
mandy, kotorye tut zhe i vypolnyayutsya.
exec [ ... ]
Argumenty rassmatrivayutsya kak komandy shella i
tut zhe vypolnyayutsya, no pri etom ne sozdaetsya
novogo processa. V kachestve argumentov mogut
byt' ukazany napravleniya vvoda-vyvoda i, esli
net nikakih drugih argumentov, to budet izmene-
no lish' napravlenie vvoda-vyvoda tekushchej prog-
rammy.
exit [ n ] Zavershenie vypolneniya shella s kodom zaversheniya
n. Esli n opushcheno, to kodom zaversheniya budet
kod zaversheniya poslednej vypolnennoj komandy
(konec fajla takzhe privodit k zaversheniyu vypol-
neniya).
export [ ... ]
Dannye peremennye otmechayutsya dlya avtomatichesko-
go eksporta v okruzhenie (sm. Okruzhenie) vypol-
nyaemyh komand. Esli argumenty ne ukazany, to
vyvoditsya spisok vseh eksportiruemyh peremen-
nyh. Imena funkcij ne mogut eksportirovat'sya.
hash [ -r ] [ ... ]
Dlya kazhdoj iz ukazannyh komand opredelyaetsya
i zapominaetsya put' poiska. Opciya -r udalyaet
vse zapomnennye dannye. Esli ne ukazan ni odin
argument, to vyvoditsya informaciya o zapomnennyh
komandah: hits - kolichestvo obrashchenij shella k
dannoj komande; cost - ob®em raboty dlya obnaru-
zheniya komandy v spiske poiska; command - polnoe
imya komandy. V nekotoryh situaciyah proishodit
perevychislenie zapomnennyh dannyh, chto otmecha-
etsya znachkom * v pole hits.
pwd Vyvodit imya tekushchej direktorii.
read [ ... ]
CHitaetsya iz standartnogo vvoda odna stroka;
pervoe ee slovo prisvaivaetsya pervoj peremen-
noj, vtoroe - vtoroj i t.d., prichem vse ostav-
shiesya slova prisvaivayutsya poslednej peremen-
noj.
readonly [ ... ]
Zapreshchaetsya izmenenie znachenij ukazannyh pere-
mennyh. Esli argument ne ukazan , to vyvoditsya
informaciya obo vseh peremennyh tipa readonly.
return [ n ] Vyhod iz funkcii s kodom zaversheniya n. Esli n
opushcheno, to kodom zaversheniya budet kod zavershe-
niya poslednej vypolnennoj komandy.
set [ --aefkntuvx [ ... ] ]
Komanda ustanavlivaet sleduyushchie rezhimy:
-a otmetit' peremennye, kotorye byli izmeneny ili
sozdany, kak peremennye okruzheniya (sm. Okruzhe-
nie)
-e esli kod zaversheniya komandy nenulevoj, to ne-
medlenno zavershit' vypolnenie shella
-f zapretit' generaciyu imen fajlov
-k vse peremennye s imenem pomeshchayutsya v okruzhenie
komandy, a ne tol'ko te, chto predshestvuyut imeni
komandy (sm. Okruzhenie)
-n chitat' komandy, no ne vypolnyat' ih
-t zavershenie shella posle vvoda i vypolneniya od-
noj komandy
-u pri podstanovke rassmatrivat' neustanovlennye
peremennye kak oshibki
-v vyvesti vvodimye stroki srazu posle ih vvoda
-x vyvesti komandy i ih argumenty pered ih vypol-
neniem
-- ne izmenyaet flagi, polezen dlya prisvaivaniya po-
zicionnym peremennym novyh znachenij.
Pri ukazanii + vmesto - kazhdyj iz flagov usta-
navlivaet protivopolozhnyj rezhim. Nabor tekushchih
flagov est' znachenie peremennoj $-. - eto
znacheniya, kotorye budut prisvoeny pozicionnym
peremennym $1, $2 i t.d. Esli vse argumenty
opushcheny, vyvodyatsya znacheniya vseh peremennyh.
shift [ n ] Pozicionnye peremennye, nachinaya s $(n+1), pere-
imenovyvayutsya v $1 i t.d. Po umolchaniyu n=1.
test vychislyaet uslovnye vyrazheniya (sm. Dopolnitel'-
nye svedeniya. Test )
trap [ ] [ n ] ...
Komanda budet vypolnena, kogda shell po-
luchit signal n (sm. Signaly). (Nado zametit',
chto proveryaetsya pri ustanovke preryvaniya
i pri poluchenii signala). Komandy vypolnyayutsya
po poryadku nomerov signalov. Lyubaya popytka us-
tanovit' signal, ignoriruemyj dannym processom,
ne obrabatyvaetsya. Popytka preryvaniya po signa-
lu 11 (segmentation violation) privodit k oshib-
ke. Esli opushchen, to vse preryvaniya usta-
navlivayutsya v ih nachal'nye znacheniya. Esli
est' pustaya stroka, to etot signal ignoriruetsya
shellom i vyzyvaemymi im programmami. Esli n=0,
to vypolnyaetsya pri vyhode iz shella. Trap
bez argumentov vyvodit spisok komand, svyazannyh
s kazhdym signalom.
type [ ... ]
Dlya kazhdogo imeni pokazyvaet, kak ono budet in-
terpretirovat'sya pri ispol'zovanii v kachestve
imeni komandy: kak vnutrennyaya komanda shella,
kak imya fajla ili zhe takogo fajla net voobshche.
ulimit [ -f ] [ n ]
Ustanavlivaet razmer fajla v n blokov; -f - us-
tanavlivaet razmer fajla, kotoryj mozhet byt'
zapisan processom-potomkom (chitat' mozhno lyubye
fajly). Bez argumentov - vyvodit tekushchij raz-
mer.
umask [ nnn ] Pol'zovatel'skaya maska sozdaniya fajlov izmenya-
etsya na nnn. Esli nnn opushcheno, to vyvoditsya te-
kushchee znachenie maski. Primer: posle komandy
umask 755
budut sozdavat'sya fajly, kotorye vladelec smo-
zhet chitat', pisat' i vypolnyat', a vse ostal'nye
- tol'ko chitat' i vypolnyat'.
unset [ ... ]
Dlya kazhdogo imeni udalyaet sootvetstvuyushchuyu pere-
mennuyu ili funkciyu. Peremennye PATH, PS1, PS2 i
IFS ne mogut byt' udaleny.
wait [ n ] ZHdet zaversheniya ukazannogo processa i vyvodit
kod ego zaversheniya. Esli n ne ukazano, to ozhi-
daetsya zaversheniya vseh aktivnyh processov-po-
tomkov i vozvrashchaetsya kod zaversheniya 0.
* 4_ Vypolnenie shell-programm *
Programma, interpretiruyushchaya shell-programmy, nahoditsya v
fajle /bin/sh. Pri zapuske ee pervyj argument yavlyaetsya imenem
shell-programmy, ostal'nye peredayutsya kak pozicional'nye para-
metry. Esli fajl, soderzhashchij shell-programmu, imeet pravo vy-
polneniya (x), to dostatochno ukazaniya lish' ego imeni. Naprimer,
sleduyushchie dve komandy operacionnoj sistemy ekvivalentny (esli
fajl ficofl obladaet ukazannym pravom i na samom dele soderzhit
shell-programmu):
sh ficofl -d . g\*
i
ficofl -d . g\*
Pri vypolnenii shell-programm vypolnyayutsya vse podstanovki.
Esli imya komandy sovpadaet s imenem special'noj komandy, to ona
vypolnaetsya v ramkah tekushchego processa. Tak zhe vypolnyayutsya i
opredelennye pol'zovatelem funkcii. Esli imya komandy ne sovpa-
daet ni s imenem special'noj komandy, ni s imenem funkcii, to
porozhdaetsya novyj process i osushchestvlyaetsya popytka vypolnit'
ukazannuyu komandu.
Peremennaya PATH opredelyaet put' poiska direktorii, soder-
zhashchej dannuyu komandu. Po umolchaniyu eto
::/bin:/usr/ bin:/util:/dss/rk
Direktorii poiska razdelyayutsya dvoetochiyami; :: oznachaet tekushchuyu
direktoriyu. Esli imya komandy soderzhit simvol /, znachenie $PATH
ne ispol'zuetsya: imena, nachinayushchiesya s / ishchutsya ot kornya, os-
tal'nye - ot tekushchej direktorii. Polozhenie najdennoj komandy
zapominaetsya shellom i mozhet byt' oprosheno komandoj hash.
Okruzhenie - eto nabor par imya-znachenie, kotorye peredayutsya
vypolnyaemoj programme. Shell vzaimodejstvuet s okruzheniem nes-
kol'kimi sposobami. Pri zapuske shell sozdaet peremennuyu dlya
kazhdoj ukazannoj pary, pridavaya ej sootvetstvuyushchee znachenie.
Esli vy izmenite znachanie kakoj-libo iz etih peremennyh ili
sozdadite novuyu peremennuyu, to eto ne okazhet nikakogo vliyaniya
na okruzhenie, esli ne budet ispol'zovana komanda export dlya
svyazi peremennoj shella s okruzheniem (sm. takzhe set -a). Pere-
mennaya mozhet byt' udalena iz okruzheniya komandoj unset (sm.).
Takim obrazom, okruzhenie kazhdoj iz vypolnyaemyh shellom komand
formiruetsya iz vseh neizmenennyh par imya-znachenie, pervonachal'-
no poluchennyh shellom, minus pary, udalennye komandoj unset,
plyus vse modificirovannye i izmenennye pary, kotorye dlya etogo
dolzhny byt' ukazany v komande export.
Okruzhenie prostyh komand mozhet byt' sformirovano ukazaniem
pered nej odnogo ili neskol'kih prisvaivanij peremennym. Tak,
TERM=d460
i
(export TERM; TERM=d460; )
ekvivalentny. Peremennye, uchastvuyushchie v takih prisvaivaniyah,
nazovem klyuchevymi parametrami.
Esli ustanovlen flag -k (sm. set), to vse klyuchevye para-
metry pomeshchayutsya v okruzhenie komandy, dazhe esli oni zapisany
posle komandy.
UNIXom podderzhivayutsya sleduyushchie signaly:
SIGHUP - 1 - otmenit' (hangup)
SIGINT - 2 - preryvanie (interrupt)
SIGQUIT - 3 - nestandartnyj vyhod (quit)
SIGILL - 4 - nevernaya komanda (illegal instruction)
SIGTRAP - 5 - lovushka (trace trap)
SIGFPE - 8 - isklyuchitel'naya situaciya pri vypolnenii operacij
s plavayushchej zapyatoj (floating-point exception)
SIGKILL - 9 - unichtozhenie processa (kill)
SIGBUS - 10 - oshibka shiny (bus error)
SIGSEGV - 11 - narushenie segmentacii (segmentation violation)
SIGSYS - 12 - nevernyj sistemnyj vyzov (bad argument to sys-
tem call)
SIGPIPE - 13 - zapis' v kanal bez chteniya iz nego (write on a
pipe with no one to read it)
SIGALRM - 14 - budil'nik (alarm clock)
SIGTERM - 15 - programmnoe zavershenie processa (software ter-
mination signal)
Signaly SIGINT i SIGQUIT ignoriruyutsya, esli komanda byla
zapushchena asinhronno. Inache signaly obrabatyvayutsya tak zhe, kak v
processe-predke, za isklyucheniem signala SIGSEGV (sm. takzhe Spe-
cial'nye komandy. Trap).
Pri vypolnennii komand zapominaetsya ih mestonahozhdenie.
Poetomu pri sozdanii komandy s tem zhe imenem, no nahodyashchejsya v
drugoj direktorii, vse ravno budet vypolnyat'sya staraya komanda
(esli vyzov proishodit po korotkomu imeni). Dlya ispravleniya si-
tuacii vospol'zujtes' komandoj hash s klyuchom -r (sm. Special'-
nye komandy).
Esli vy pereimenovali tekushchuyu ili vyshelezhashchuyu direktoriyu,
to komanda pwd mozhet davat' nevernuyu informaciyu. Dlya ispravle-
niya situacii vospol'zujtes' komandoj cd s polnym imenem direk-
torii.
* 5_ Dopolnitel'nye svedeniya *
Komanda test primenyaetsya dlya proverki usloviya. Format vy-
zova:
test
ili
[ ]
Komanda test vychislyaet i, esli ego znachenie - isti-
na, vozvrashchaet kod zaversheniya 0 (true); inache - nenulevoe zna-
chenie (false). Nenulevoj kod zaversheniya vozvrashchaetsya i esli
opushcheny argumenty. mozhet sostoyat' iz sleduyushchih pri-
mitivov:
-r fajl - istina, esli fajl sushchestvuet i dostupen dlya
chteniya
-w fajl - istina, esli fajl sushchestvuet i dostupen dlya
zapisi
-x fajl - istina, esli fajl sushchestvuet i yavlyaetsya vy-
polnyaemym
-f fajl - istina, esli fajl sushchestvuet i yavlyaetsya obych-
nym fajlom
-d fajl - istina, esli fajl sushchestvuet i yavlyaetsya di-
rektoriej
-c fajl - istina, esli fajl sushchestvuet i yavlyaetsya spe-
cial'nym simvol'no-orientirovannym fajlom
-b fajl - istina, esli fajl sushchestvuet i yavlyaetsya spe-
cial'nym blok-orientirovannym fajlom
-p fajl - istina, esli fajl sushchestvuet i yavlyaetsya ime-
novannym kanalom (pipe)
-s fajl - istina, esli fajl sushchestvuet i imeet nenule-
vuyu dlinu
-t [ deskriptor fajla ]
- istina, esli otkrytyj fajl s ukazannym desk-
riptorom (po umolchaniyu 1) sushchestvuet i associi-
rovan s terminalom
-zho s1 - istina, esli dlina stroki s1 nulevaya
-n s1 - istina, esli dlina stroki s1 nenulevaya
s1 = s2 - istina, esli stroki s1 i s2 sovpadayut
s1 != s2 - istina, esli stroki s1 i s2 ne sovpadayut
s1 - istina, esli s1 nepustaya stroka
n1 -eq n2 - istina, esli celye n1 i n2 algebraicheski sov-
padayut . Na meste -eq mogut byt' takzhe -ne,
-gt, -ge, -lt, -le
Komanda expr primenyaetsya dlya vychisleniya vyrazhenij. Rezul'-
tat vyvoditsya na standartnyj vyvod. Operandy vyrazheniya dolzhny
byt' razdeleny probelami. Metasimvoly dolzhny byt' ekranirovany.
Nado zametit', chto 0 vozvrashchaetsya v kachestve chisla, a ne dlya
indikacii pustoj stroki. Stroki, soderzhashchie probely ili drugie
special'nye simvoly, dolzhny byt' zaklyucheny v kavychki. Celye
rassmatrivayutsya kak 32-bitnye chisla.
Nizhe priveden spisok operatorov v poryadke vozvrastaniya
prioriteta, operacii s ravnym prioritetom zaklyucheny v figurnye
skobki. Pered simvolami, kotorye dolzhny byt' ekranirovany, sto-
it \.
\|
esli pervoe ne pustoe i ne nulevoe, to
vozvrashchaet ego, inache vozvrashchaet vtoroe
\&
esli oba ne pustye i ne nulevye, to
vozvrashchaet pervoe , inache vozvrashchaet 0
{ =, \>, \>=, \<, \<=, != }
vozvrashchaet rezul'tat celochislennogo sravneniya
esli oba - celye; inache vozvrashchaet re-
zul'tat leksicheskogo sravneniya
{ +, - }
slozhenie i vychitanie celochislennyh argumentov
{ \*, /, % }
umnozhenie, delenie i poluchenie ostatka ot dele-
niya celochislennyh argumentov
:
operator sopostavleniya : sopostavlyaet pervyj
argument so vtorym, kotoryj dolzhen byt' regu-
lyarnym vyrazheniem. Obychno operator sravneniya
vozvrashchaet chislo simvolov, udovletvoryayushchih ob-
razcu (0 pri neudachnom sravnenii). Odnako sim-
voly \( i \) mogut primenyat'sya dlya vydeleniya
chasti pervogo argumenta.
Regulyarnoe vyrazhenie stroitsya sleduyushchim obrazom:
. - oboznachaet lyuboj simvol
* - oboznachaet predydushchij simvol, povtorennyj neskol'ko
raz
[] - oboznachayut lyuboj odin iz ukazannyh mezhdu nimi simvo-
lov; gruppa simvolov mozhet oboznachat'sya s pomoshch'yu
znaka "-" (t.e. [0-9] ekvivalentno [0123456789]); es-
li posle [ stoit ^, to eto ekvivalentno lyubomu simvo-
lu, krome ukazannyh v skobkah i ;
dlya ukazaniya ] v kachestve obrazca, nado postavit' ee
srazu za [ (t.e. []...]); . i * vnutri kvadratnyh
skobok oboznachayut samih sebya
Vse ostal'nye simvoly (i ^, esli stoit ne v kvadratnyh skobkah)
oboznachayut samih sebya. Dlya ukazaniya simvolov ., *,[ i ] nado
ekranirovat' ih (t.e. pisat' \., \*, \[, \]).
Primery.
1. a=`expr $a + 1`
- uvelichenie na 1 peremennoj a
2. expr $a : '.*/\(.*\)' \| $a
- vydelyaet iz imeni fajla korotkoe imya (t.e. iz
/usr/util/ena vydelyaetsya ena). Vnimanie,
odinochnyj simvol / budet vosprinyat kak znak
operacii deleniya.
3. expr $VAR : '.*'
- poluchenie kolichestva simvolov peremennoj VAR.
V kachestve pobochnogo effekta expr vozvrashchaet sleduyushchie kody za-
versheniya:
0 - esli vyrazhenie ne nul' i ne pustaya stroka
1 - esli vyrazhenie nul' ili pustaya stroka
2 - dlya nekorrektnyh vyrazhenij
Komanda expr takzhe vydaet sleduyushchie soobshcheniya ob oshibkah:
syntax error - dlya oshibok v operatorah ili operandah
non-numeric argument - dlya popytok primeneniya arifmeticheskih
operacij k nechislovym strokam
Zamechanie.
Dopustim, chto my hotim sravnit' znachenie peremennoj a s
kakim-libo simvolom, imeyushchim dlya expr osobyj smysl, naprimer,
so znakom ravenstva. Pust' $a na samom dele yavlyaetsya znakom ra-
venstva. Tak kak argumenty predvaritel'no obrabatyvayutsya shel-
lom, to komanda
expr $a = '='
budet vosprinyata kak
expr = = =
chto sintaksicheski nekorrektno. V podobnyh sluchayah nado pol'zo-
vat'sya takim priemom:
expr X$a = X=
t.e. dobavleniem nekotorogo simvola k obeim strokam, chto nikak
ne vliyaet na rezul'tat sravneniya, odnako pozvolyaet izbezhat'
sintaksicheskoj oshibki.
Komanda ena pozvolyaet poluchit' chasti polnogo imeni fajla.
Pervyj argument - flag, vtoroj - imya fajla. Komanda razlichaet
sleduyushchie flagi:
-n - imya fajla bez rasshireniya
-f - imya fajla s rasshireniem
-e - rasshirenie
-d - imya direktorii
-p - esli imya fajla nachinaetsya s . ili .. , to eti
simvoly vydelyayutsya iz imeni
Nizhe privoditsya tekst programmy ena, hranyashchijsya v /util/ena.
# Get part of pathname
case $1 in
-n )
expr $2 : '.*/\(.*\)[.].*' \| $2 : '\(.*\)[.].*' \| $2
;;
-f )
expr $2 : '.*/\(.*\)' \| $2
;;
-e )
expr $2 : '.*\([.][^./]*\)' \| ' '
;;
-d )
expr $2 : '\(.*\)/.*' \| $2
;;
-p )
expr $2 : '\([.]\)/.*' \| $2 : '\([.][.]\)/.*' \| ' '
;;
* )
echo "error: unknown part of pathname $1"
exit 2
;;
esac
Last-modified: Sun, 07 Jul 2002 09:31:58 GMT