Shell i programiranje shell-a
Shell je komandni interpreter, tj. jos jedan sloj kojim je hardver
racunara sakriven od korisnika.
Shell je korisnicki program kao i svaki drugi.
Shell kao komandni interpreter.
Shell kao skript interpreter.
Vrste shell-ova
Bourne Shell
| /bin/sh
|
C Shell
| /bin/csh
|
Korn Shell
| /bin/ksh
|
Turbo C Shell
| /bin/tcsh
|
Osobina | Opis | Bourne | Korn | C
|
---|
Kontrola toka
| Omogucuje kontrolu izvrsavanja scripta pomocu konstrukcija kao sto su
petlje uslovne naredbe i sl.
| Da
| Da
| Da
|
---|
Pracenje signala
| Mogucnost pracenja interrupt i drugih signala koje salje UNIX.
| Da
| Da
| Da
|
---|
Restriktivni shell
| U cilju povecanja sigurnosti sistema, nekim korisnicima se dodeljuje
shell sa ogranicenim mogucnostima.
| Da
| Da
| Ne
|
---|
alias komande
| Korisniku stoji na raspolaganju mogucnost da preimenuje neke komande ili
da vise komande ujedini u jednu.
| Ne
| Da
| Da
|
---|
nizovi
| Mogucnost da se vise podataka identifikuje istim imenom.
| Ne
| Da
| Da
|
---|
istorija komandi
| Mogucnost da se komande smestaju u bafer, kasnije modifikuju i ponovo
izvrsavaju.
| Ne
| Da
| Da
|
---|
Kompletiranje imena fajlova
| Mogucnost da se u komandnoj liniji automatski dovrsi ime zapocetog
fajla.
| Ne
| Da
| Da
|
---|
Integer aritmetika
| Mogucnost obavljanja aritmetickih operacija nad promenljivima u
scriptu bez UNIX komandi.
| Ne
| Da
| Da
|
---|
Kontrola posla
| Mogucnost pracenja i pristupa poslovima koji se odvijaju u pozadini.
| Ne
| Da
| Da
|
---|
Editovanje komandne linije
| Mogucnost da se prethodne ili tekuca komandna linija modifikuju tekst
editorom.
| Ne
| Da
| Ne
|
---|
command_name arg1 arg2 ... < Enter >
- command_name je naziv komande, izvrsnog programa ili
ugradjene komande u sam shell.
- arg1, arg2, ... argumenti komande. Njima se specificiraju imena
fajlova, direktorijuma, korisnika ili se zahtevaju neke opcione mogucnosti
komande. Po konvenciji opcioni parametri pocinju sa "-".
?
| Zamenjuje samo jedan znak. Primer:
% ls prim?.c
prim1.cprim2.c
|
*
| Zamena bilo kog stringa. Primer:
% ls *.c
prim1.c prim2.c primer.c
|
.
| Skracenica za tekuci direktorijum. Primer:
% cp /usr/include/*.h .
|
..
| Skracenica za direktorijum hijerarhijski iznad tekuceg. Primer:
% cp *.c ..
|
~
Skracenica za HOME direktorijum tekuceg korisnika. Primer:
% cp *.c ~
| ~user
| Skracenica za HOME direktorijum korisnika sa login imenom user. Primer:
% cp ~srle/*.* ~tanja
| [...]
Zamenjuje se bilo koji znak iz zagrade. Primer:
% ls srle[abc1].c
srlea.c srlec.c srle1.c
| [x-y]
| Zamenjuje bilo koji znak u rangu od x do y. Primer:
% ls srle[a-g].c
srleb.c srled.c
| { string..}
Grupisanje. Primer:
% ls { x *y* ?z* }
x myfile yourfile xza yza
| | | |
- standardni ulaz (stdin, tastatura)
- standardni izlaz (stdout, monitor)
- dijagnosticki izlaz (stderr, monitor)
> file_name
| Preusmerava standardni izlaz u file_name. Ako
file_name postoji gubi se prethodni sadrzaj. Ovo se moze spreciti
ako se setuje shell promenljiva noclobber (set noclobber).
Primer:% cat file1 file2 > file3
|
>! file_name
| Forsirano preusmeravanje. Iako file_name postoji i setovana je
promenljiva noclobber, vrsi se prepisivanje starog sadrzaja.
|
>& file_name
| Preusmeravanje standardnog izlaza i dijagnostickog izlaza. Primer:
% rm -r nonexisting_dir >& /dev/null
|
>&! file_name
| Forsirano preusmeravanje standardnog i dijagnostickog izlaza.
|
>> file_name
| Preusmeravanje standardnog izlaza u file_name. Zapis se dodaje
vec postojecem sadrzaju datoteke file_name.
|
>>& file_name
| Preusmeravanje standardnog i dijagnostickog izlaza u file_name.
Stari sadrzaj se ne brise vec mu se dodaje novi.
|
>>&! file_name
| Forsirano preusmeravanje standardnog i dijagnostickog izlaza u
file_name. Stari sadrzaj se ne brise.
|
cmd1 | cmd2 | cmd3
| Pipelining. Standardni izlaz prethodne komande se usmerava na standardni
ulaz naredne. Primer:% ps -ef | grep getty | more
|
(cmd1; cmd2;... )
| Grupisane komande. C shell ovu grupu tretira kao jednu celinu.
|
(... ) >& file_name
| Usmeravanje standardnog i dijagnostickog izlaza grupe komandi u datoteku
file_name. Primer:% (ls -l; ls -a; ls -s) >& listings
|
< file_name | Preusmeravanje
standardnog ulaza iz fajla file_name. Primer:
% mail < pismo
|
command << word
| Saopstava se komandi command (obicno je interaktivna) da
standardni ulaz cita iz istog fajla. Primenjuje se u skriptovima. Rec
word se tretira kao end-of-input.
|
;
| Razdvajanje komandi.Primer: % ls -l; rm *.* < Enter >
\
| Nastavljanje komande u vise redova. Primer:
% cat *.* \ < Enter >
grep "srle" | \ < Enter >
more < Enter >
| |
\
| Sprecava specijalno znacenje narednog znaka. Primer - brisanje fajla
ime": % rm ime\"
|
' ... '
| C shell tretira uokvireni tekst kao jednu rec. Primer:
p: echo $1
% p srle tanja
srle
% p 'srle tanja'
srle tanja
|
" ... "
| Uokvireni tekst se tretira kao jedna rec ali se ! i $ uvazavaju.
Primer:% echo '$home $cwd'
$home $cwd
% echo "$home $cwd"
/usr/people/srle /tmp
|
`command`
Zamena komande sa rezultatom. Primer:
% rm `find / -name core -print`
% find / -name core -exec rm '{}' ';'
| |
&
| Izvrsavanje komande u pozadini (background). Primer:
% du > zauzece &
|
< Ctrl > Z
| Privremeno zaustavljanje procesa
|
bg [%job]
| Komanda za prebacivanje procesa u pozadinu. Ako nema argumenata
prebacuje se tekuci posao (zadnje prekinuti). Primer:
% infinite
< Ctrl > Z
% bg
|
fg [%job]
| Komanda za prebacivanje procesa iz pozadine napred (foreground).
Primer:
% infinite &
% fg %infinite
|
stop [%job]
| Prekida proces koji se izvrsava u pozadini. Primer:
% stop %infinite
|
< Ctrl > C
| Prekidanje tekuceg procesa.
|
!!
| Prethodna komanda. Primer:
% !! < Enter>
Izvrsava ponovo prethodnu komandu.
|
!n
| Komandna linija broj n. Broj n se moze otkriti sa
history.
|
!-n
| Komandna linija sa brojem za n manji od tekuceg.
|
!string
| Zadnja komandna linija koja pocinje sa string. Primer:
% cc proba.c pr.c obj.o -o proba -lm
....
% !cc
|
!?string?
| Zadnja komandna linija koja sadrzi string.
|
!n*
| Svi argumenti n-te komandne linije. Ako se ne zada n
podrazumeva se prethodna linija. Primer:
% cc proba.o pr.o obj.o -o proba
% rm !*
!n^
| Prvi argument n-te komandne linije.
| !n$
| Zadnji argument n-te komandne linije.
| !i:j
| j-ti argument i-te komandne linije
| ^str1^str2
| U zadnjoj komandi zameni str1 sa str2.
|
!n:s/str1/str2/
| U n-toj komandnoj liniji zameni str1 sa str2.
| |
- Uz pomoc VI (ili nekog drugog tekst editora) formira se script. Ako
prva linija pocinje sa # onda je C shell script. U suprotnom, script se
tretira kao Bourne shell script.
/bin/csh [-vx] script_name args ...
-v | ispisuje linije skripta koje se izvrsavaju
|
-x | ispisuje komande koje se izvrsavaju
|
ili:
% chmod +x script_name
% script_name args ...
Argumenti iz komandne linije se prenose u script i preko promenljive
argv.
Primer: | Ekvivalentno:
|
echo $argv | echo $*
|
echo $argv[2] | echo $2
|
Postoji samo jedan tip: polje reci (stringova)
Dodeljivanje vrednosti promenljivoj:
set var_name
|
set var_name=value
|
set var_name=($<)
|
@ var_name = izraz
|
@ var_name[i] = izraz
|
set var_name = $other_var
|
unset var_name - resetovanje promenljive
|
Primeri:
set var=(srle.c srle.o tanja.c tanja.o)
echo "Type yes or no?"
set yes_no=($<)
set i=15
set j=20
k = $i + $j
echo $k
$var
| Vrednost promenljive var.
|
$var[selector]
| Selektovanje reci unutar promenljive var.
|
$#var
| Daje broj reci u promenljivoj.
|
$?var
| 1 ako je var setovana 0 ako nije
|
$n
| Ekvivalentno je sa $argv[n]
|
$*
| Ekvivalentno je sa $argv[*]
|
$0
| Ime sripta (nulti argument komandne linije)
|
$$
PID tekuceg procesa
| |
+ | Sabiranje
|
- | Oduzimanje
|
* | Mnozenje
|
/ | Deljenje
|
% | Deljenje po modulu
|
++ | Inkrementiranje
|
-- | Dekrementiranje
|
<< | Pomeranje u levo.
|
>> | Pomeranje u desno.
|
| | Ili operacija.
|
^ | Ekskluzivno ili.
|
& | I operacija
|
==
| Istinito ako je levi string jednak desnom.
|
!=
| Istinito ako levi string nije jednak desnom.
|
=~
| Istinito ako levi string odgovara stringu sa desne strane s tim sto su
univerzalni znaci dozvoljeni ($file =~ *.c).
!~
| Istinito ako levi string ne odgovara stringu sa desne strane.
Univerzalni znaci su i ovde dozvoljeni ($file !~ *.c).
<
| Istinito ako je broj sa leve strane manji od desnog.
| <=
| Istinito ako je broj sa leve strane manji ili jednak broju sa desne
strane.
| >
| Istinito ako je broj sa leve strane veci od desnog.
| >=
| Istinito ako je broj sa leve strane veci ili jednak broju sa desne
strane.
| ||
| Logicko ili.
| &&
| Logicko i.
| { command }
| Istinito ako je komanda uspesno zavrsena.
| | |
IF
if (izraz) then if (izraz) then
commands commands
endif else if (izraz) then
commands
else
commands
endif
Provera fajlova:
if ( -c filename) then
....
gde je -c :
-r
| Istinito ako korisnik koji izvrsava script moze da cita fajl.
|
-w
| Istinito ako korisnik koji izvrsava script moze da pise u fajl.
|
-x
| Istinito ako korisnik koji izvrsava script moze da izvrsava fajl.
|
-e
| Istinito ako fajl postoji.
|
-o
| Istinito ako je korisnik koji izvrsava script vlasnik fajla.
|
-z
| Istinito ako je fajl prazan.
|
-d
| Istinito ako je direktorijum.
|
SWITCH
switch ( $var ) switch( $1 )
case str1: case -p:
commands lp $2
breaksw breaksw
... case -c:
case strn: cc -c $2
commands breaksw
breaksw case -l:
default: cc $2
commands breaksw
breaksw endsw
endsw
FOREACH
foreach var_name ( wordlist ) foreach arg ($*)
commands echo $arg
end end
WHILE
while ( izraz ) set i=1
commands set j=10
end while($i <= $j )
echo Nesto
@i++
end
GOTO
loop:
commands
goto loop
Komentari:
| sve od # do kraja linije se ignorise.
|
---|
Izlaz:
| izlazak iz shell-a sa statusom status. exit [status]
|
---|
alias [name [expresion]]
| Bez argumenata prikazuje sve definisane aliase i njihove izraze. Samo sa
name printa alias sa tim imenom. Kompletna komanda definise novi
alias pod imenom name.
|
bg [%job]
| Prebacuje proces u pozadinu.
|
cd [name], chdir [name]
| Promena tekuceg direktorijuma.
|
echo [-n [words ...] ]
| Ispisuje words na standardnom izlazu. Sa opcijom -n sprecava
se prelazak u novu liniju.
|
exit [status]
|
fg [%job]
| Vracanje procesa iz pozadine.
|
history
|
jobs [ l ]
| Daje listu poslova. Sa -l dobija se detaljnija lista.
|
kill
|
login
|
logout
|
nohup [command [args ...]]
| Izvrsava komandu ignorisuci signale. Komanda se ne mo`e prekinuti ni kada se
korisnik koji je startovao odjavi sa sistema.
|
rehash
| Preracunava tabelu direktorijuma u promenljivoj path. Neophodno jedino kada
se dodaju nove komande dok ste prijavljeni sistemu.
|
repeat count command [ args ...]
| Ponavlja komandu count puta.
|
setenv name value
| Postavlja promenljive okoline (USER, TERM i PATH se postavljaju automatski).
|
shift [variable]
| Pomera reci u variable u levo. Prva rec se gubi. Ako nije definisano ime
promenljive, koristi se argv.
|
source [-h] filename
| Izvrsava drugi script. Sa -h opcijom komanhe iz scripta se ne
izvrsavaju nego samo umecu u history listu.
|
stop [%job]
|
unalias pattern
| Brise postavljene aliase cija imena odgovaraju pattern-u. Npr.
unalias * brise sve.
|
unset pattern
| Resetuje sve promenljive cija imena odgovaraju pattern-u. unset *
resetuje sve.
|
unsetenv pattern
| Brise promenljive okoline cija imena odgovaraju pattern-u. unsetenv *
brise sve.
|
argv | argumenti iz komandne linije
|
cwd | tekuci direktorijum
|
home | HOME direktorijum
|
ignoreeof | Ako je setovana, shell ce ignorisati < Ctrl > D sa
terminala. Sprecava se nezeljeni logout.
|
mail | Lista fajlova gde shell proverava da li je pristigla
posta. Ako je prva rec u mail broj onda je to interval (u sekundama)
na koliko se proverava pristizanje poste.
|
noclobber | Ako je setovana nije dozvoljeno prepisivanje
fajlova redirekcijom.
|
path | lista direktorijuma gde shell trazi komande.
|
prompt | String koji se pojavljuje na monitoru kada je shell
spreman da primi narednu komandu. ! se zamenjuje rednim brojem komandne
linije. Obicno se postavlja na sledecu vrednost:
set prompt="`hostname`\!% "
|
filec | Ako je setovana, ukljuceno je kompletiranje imena
fajlova i drektorijuma. Otkucaju se samo prvih nekoliko znakova, dovoljnih
da jednoznacno asociraju na zeljeni fajl, a zatim se pritisne < Esc >
taster. Shell ce sam kompletirati ime fajla.
|
Dva fajla, koja u stvari predstatvljaju shell skriptove, se izvrsavaju u
toku login procedure. To su .login i .cshrc i oba se nalaze na
HOME direktorijumu korisnika. Prvi se izvrsava iz login programa koji
obavlja autorizaciju korisnika (provera login imena i passworda). Ako je
autorizacija obavljena uspesno, sam login program startuje shell
korisnika. Slicno, kao login, shell izvrsava svoj start-up fajl.
Start-up fajl C shell-a je .cshrc. Oba pomenuta start-up fajla sluze
za inicijalno automatsko izvrsavanje odredjenih komandi, definisanje aliasa,
promenljivih radne okoline, i slicno. Razlika izmedju .login i
.cshrc fajla je ta sto se .login izvrsava prvi i to pre
startovanja shell-a, ali to obicno nije znacajno. Ipak, korisniku se
preporucuje dodavanje svojih definicija u .cshrc fajl.
Tipican sadrzaj .cshrc fajla:
# Definicija aliasa
#
alias ls "ls -CF"
alias ll "ls -al"
alias la "ls -a
alias hi "history"
alias xdvi "xdvi -geometry 730x860+30-1 -s 4 -paper a4"
alias snns "snns -mono"
#
# Definisanje promenljivih shell-a
#
set history=40
set filec
set prompt="`hostname` \!% "
set path=($path /usr/TeX/bin ~srle/bin /usr/local/spice/bin)
#
# Promenljive okoline
#
setenv SPICE_LIB_DIR /usr/local/spice/lib
#
# Ostalo
#
umask 077