Shell i programiranje shell-a


Uvod

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


Poredjenje osobina shell-ova

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

C Shell kao komandni interpreter


Opsta sintaksa komandi

command_name arg1 arg2 ... < Enter >

Univerzalni znaci

? 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


Redirekcija

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


Nastavljanje i razdvajanje komandi

; Razdvajanje komandi.Primer:
 % ls -l; rm *.* < Enter >

\ Nastavljanje komande u vise redova. Primer:
% cat *.* \ < Enter >
grep "srle" | \ < Enter >
more < Enter >


Specijalni znaci i navodnice

\ 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 '{}' ';'


Kontrola poslova

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


History mehanizam

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


C shell kao script interpreter


Proces kreiranja i izvrsavanja C shell script-a

/bin/csh [-vx] script_name args ...

-vispisuje linije skripta koje se izvrsavaju
-xispisuje komande koje se izvrsavaju

ili:
% chmod +x script_name
% script_name args ...

Argumenti komandne linije

Argumenti iz komandne linije se prenose u script i preko promenljive argv.

Primer: Ekvivalentno:
echo $argv
echo $*
echo $argv[2]
echo $2

Promenljive

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


Aritmeticke operacije

+ Sabiranje
- Oduzimanje
* Mnozenje
/ Deljenje
% Deljenje po modulu
++ Inkrementiranje
-- Dekrementiranje


Logicke operacije

<< Pomeranje u levo.
>> Pomeranje u desno.
| Ili operacija.
^ Ekskluzivno ili.
& I operacija


Logicki operatori

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


Kontrolne strukture

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 i izlaz

Komentari: sve od # do kraja linije se ignorise.
Izlaz: izlazak iz shell-a sa statusom status.
exit [status]

Najznacajnije ugradjene komande

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.


Najznacajnije predefinisane promenljive

argvargumenti iz komandne linije
cwdtekuci direktorijum
homeHOME direktorijum
ignoreeofAko je setovana, shell ce ignorisati < Ctrl > D sa terminala. Sprecava se nezeljeni logout.
mailLista 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.
noclobberAko je setovana nije dozvoljeno prepisivanje fajlova redirekcijom.
pathlista direktorijuma gde shell trazi komande.
promptString 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`\!% "
filecAko 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.


Start-up fajlovi C shell-a

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