5. Programovani v shellu
Shell neni pouze interpretem
prikazovych radku, ale i velmi
vykonnym programovacim jazykem.
Programove konstrukce lze
zadavat primo z prikazoveho
radku nebo za pouziti prikazoveho
souboru (scenare - script
file) - viz kap. 3.2. Protoze mnoho
prikazovych souboru je vytvoreno
pro Bourne shell, je schopen
C-shell spustit pro interpretaci
prikazoveho souboru Bourne shell.
Pro odliseni, zda je scenar
urcen pro Bourne shell nebo C-shell,
se pouziva prvniho znaku
prvniho radku souboru. Je-li tento znak
#, potom je interpretovan
scenar C-shellem, jinak Bourne shellem.
V systemech s obema typy
shellu lze doporucit pro praci C-shell,
ktery je pohodlnejsi a mocnejsi
nez Bourne shell. Pri tvorbe
vetsich programovych celku
lze vsak spise z duvodu prenositelnosti
doporucit psani prikazovych
souboru v Bourne shellu.
5.1 Spusteni shellu
Prikazy pro spusteni shellu
byly jiz uvedeny v odstavci 3.3.
Zde pouze poznamenejme, ze
po prihlaseni do systemu interpretuje
shell automaticky prikazovy
soubor .login (pro C-shell)
nebo .profile (pro Bourne
shell) v domovskem adresari uzivatele.
Tento soubor lze vyuzit pro
spusteni uzivatelskeho prostredi
a spusteni neketrych zakladnich
procesu. Pri aktivaci shellu
(napr. prikazem csh) se automaticky
provede soubor .cshrc
(pro C-shell). Dale je zde
vhodne upozornit, ze pro docasne
pomocne soubory lze pouzit
i adresar /tmp.
5.2 Specialni znaky shellu
Existuji znaky, ktere maji
pri interpretaci shellem specialni
vyznam. Na nektere jsme jiz
narazili v odstavcich 1, 2.1 a 3.1
a 3.2.
Pouzitelne znaky se specialnim
vyznamem:
\ viz kap. 1 (potlacuje spec.
vyznam)
*, ?, [] viz kap. 2.1
>, >>, &>, <, <<,
<&, |, |& viz
kap. 3.1
;, &, () viz kap. 3.2
`...` nahrada prikazu ...
vystupem ... (spusteni!)
'...' potlacuje interpretaci
znaku uvnitr ...
"..." interpretuje jen $
a `...`
: interpretace bez vykonani
akci
# na 1.pozici radku oznacuje
komentar
{ } provedeni posloupnosti
prikazu bez spusteni
kopie shellu (pouze Bourne
shell)
{...,...} vycet variant jmena
souboru (pouze C-shell)
~ domovsky adresar (pouze
C-shell)
5.3 Promenne shellu
Jako kazdy programovaci jazyk
umoznuje shell pracovat
s promennymi, ktere vytvareji
tzv. prostredi uzivatele
a prostredi procesu. Nektere
promenne jsou v systemu
preddefinovany, prip. mohou
byt definovany pri spusteni
shellu. Jmeno promenne je
identifikator.
C-shell povazuje pouze promenne
oznacene velkymi pismeny
za soucast prostredi uzivatele.
Ostatni (napr. argv, home,
path, prompt, shell ap.)
povazuje za sve vnitrni promenne.
Prace s promennymi:
Bourne shell :
name = con prirazeni retezce
con promenne name
unset varname zruseni promenne
set vypis hodnot promennych
$name zpristupneni hodnoty
promenne
preddefinovane promenne prostedi
a procesu:
MAIL jmeno souboru pro elektronickou
postu
HOME jmeno domovskeho adresare
PATH adresare se spustitelnymi
prikazy
LOGNAME prihlasovaci jmeno
uzivatele
SHELL aktivni prikazovy interpret
TERM typ terminalu
PS1 retezec vyzvy
PS2 pokracovaci vyzva (pri
nedokoncenem vstupu)
IFS oddelovace argumentu
prikazoveho radku
0,1,2,..,9 pozicni parametry
(tj. argumenty) prikazu
(0 .. jmeno prikazu)
$ PID soucasne kopie shellu
? navratovy kod posledniho
provedeneho prikazu
! PID posledniho procesu
spusteneho na pozadi
* obsah celeho prikazoveho
radku scenare
# pocet pozicnich parametru
scenare
C-shell :
set name = str prirazeni retezce
str vnitrni promenne name
set name = ( strs ) prirazeni
seznamu retezcu strs
vnitrni promenne varname
setenv varname str prirazeni
retezce str promenne varname
z prostredi uzivatele
unset varname zruseni promenne
unsetenv varname zruseni
promenne
$?varname test existence
promenne
set vypis hodnot promennych
$name zpristupneni hodnoty
promenne
setenv vypis hodnot promennych
prostredi
$varname[num] zpristupeni
casti seznamu pomoci indexu num
$#varname pocet prvku v seznamu
pro promenne obsahujici uplne
jmeno souboru
lze uzit operatoru:
:r uplne jmeno souboru (root)
:h path (header)
:t proste jmeno souboru (tail)
preddefinovane promenne shellu:
prostredi :
argv preddefinovany promenna
predstavujici
seznam argumentu scenare
(pristup
jako do pole - rozsahy indexu)
cwd pracovni adresar
history delka uchovavane
historie
home jmeno domovskeho adresare
noclober ochrana souboru
pred prepsanim (presmerovani)
path adresare se spustitelnymi
prikazy
prompt retezec vyzvy
shell aktivni prikazovy interpret
status navratovy kod posledniho
procesu
term typ terminalu
user prihlasovaci jmeno uzivatele
MAIL jmeno souboru pro elektronickou
postu
HOME jmeno domovskeho adresare
PATH adresare se spustitelnymi
prikazy
LOGNAME prihlasovaci jmeno
uzivatele
SHELL aktivni prikazovy interpret
TERM typ terminalu
procesu :
0,1,2,..,9 pozicni parametry
(tj. argumenty) prikazu
(0 .. jmeno prikazu)
$ PID soucasne kopie shellu
5.4 Programove konstrukce
shellu
Shell poskytuje konstrukce
pro vetveni typu if a case a pro
cykly typu for, while i until.
Pro rozhodovaci vyrazy tyto
konstrukce vyuzivaji navratoveho
kodu prikazu, ktery je bud
nulovy (prikaz skoncil uspesne)
nebo nenulovy (selhani).
Pro vyhodnocovani nekterych
typu vyrazu existuji dva pomocne
prikazy test a expr. V C-shellu
existuji i numericke promenne
(viz odstavec 5.5), ktere
jsou vyuzivany pri konstrukci vyrazu.
Vyraz lze zapisovat jako
bezny prikaz v jazyce C a navic lze
testovat atributy souboru
pomoci operatoru shodnych s moznymi
argumenty prikazu test.
Programove konstrukce shellu:
Bourne shell C-shell
if cmdlist if (expr) then
then cmdlist cmdlist1
else cmdlist else
fi cmdlist2
endif
case str in switch (str)
pattern) cmdlist ;; case
pattern1:
... cmdlist
esac breaksw
...
default:
cmdlist
breaksw
endsw
for var in strs foreach name
(strs)
do cmdlist
cmdlist end
done
while cmdlist while (expression)
do cmdlist
cmdlist end
done
break break ukonceni cyklu
continue continue nasledujici
iterace
exit exit ukonceni shellu
goto label skok na navesti
label: definice navesti
read name set name = $<
precteni promenne name
ze std.vstupu
Dalsi operatory (oddelovace)
pro cmdlist:
&& prava strana se
provede pokud leva uspeje
|| prava strana se provede
pokud leva selze
Pomocne prikazy:
test arg navratovy kod je
dan vyhodnocenim vyrazu arg
-r file existuje soubor dostupny
pro cteni
-w file existuje soubor dostupny
pro zapis
-f file existuje soubor a
neni adresar
-d file existuje soubor a
je adresar
-z s delka retezce s je nulova
-n s delka retezce s neni
nulova
s1=s2 retezec s1 se rovna
s2
s1!=s2 retezec s1 se nerovna
s2
n1 -eq n2 cisla n1 a n2 jsou
si rovna
(podobne pro -ne, -gt, -ge,
-lt, -le)
expr args vysledek vyhodnoceni
je zapsan na st.vystup
args je vyraz s operatory
+,-,*,/,%
a relacnimi operatory <,<=,=,!=,>=,>
true prikaz vracejci pravdu
false nedefinovany prikaz
(vraci nepravdu)
exec [args] vymena aktualniho
shellu za proces args
pouze Bourne shell:
export [names] vyvoz promennych
shellu do prostredi
procesu-potomku
trap [arg] [nums] nastaveni
reakci shellu na typ signalu
set [-vx] nastaveni ladeni
scenare
- ukonceni ladeni
v verbose mode (tisk nactenych
radku
pred interpretaci)
x execute (tisk provadenych
prikazu)
5.5 Nektera rozsireni C-shellu
C-shell poskytuje nektera
vyznamna rozsireni. Zde uvedeme
pouze numericke promenne,
udrzovani a pristup k historii prikazu,
mechanismus zamen a rozsireni
pro rizeni procesu.
Rozsirene rizeni procesu je
zalozeno na pojmu prace (job), kterym
se oznacuje prikazovy radek.
Prace se pak muze nachazet ve stavech
provadeni (Running), pozastaveni
(Stopped), nestandardniho ukonceni
(Terminated), ukonceni (Done)
a selhani (Exit). Pomoci "ctrl-z" je
bezici program pozastaven.
Ten lze presunout bud do behu na pozadi
nebo na popredi.
Rozsirujici prikazy:
@var operator expr prirazeni
hodnoty vyrazu operator expr
numericke promenne var (vyraz
jako v C)
jsou k dispozici testy obdobne
prikazu test
-r file existuje soubor dostupny
pro cteni
-w file existuje soubor dostupny
pro zapis
-f file existuje soubor a
neni adresar
-d file existuje soubor a
je adresar
-e file soubor existuje
-o file uzivatel je vlastnik
file
set history = num nastaveni
delky historie prikazu na num
history [-hr] [num] vypis
historii v delce n radku
h prepnuti vystupu do souboru
r vypis obracene
source [-h] [file] inicializace
historie
h vstup ze souboru bez vykonani
!! opakovani prikazu (n=1)
!-n vykonani prikazu o n
zpet v historii
!n vykonani prikazu s cislem
n
!chars vykonani prikazu zacinajiciho
chars
^str1^str2 zamena str1 za
str2 v poslednim retezci
(pro editaci lze pouzit prikazu
ed)
alias [name [def]] definice
jmena name pro retezec def
(bez def - vypis definice)
unalias name zruseni vyznamu
retezce name
jobs vypise seznam praci
(jobs)
bg [%n] presun prace na pozadi
fg [%n] presun prace do popredi
%n cislo procesu
|