A C Shell-t a BSD fejleszts sorn fejlesztettk (Bill Joy, a ksbbi Sun Microsystems
alapt). Amint nevbl kiderl, szerkezetei hasonltanak a C-re. Ebben fejlesztettk tovbb
a feladatok (jobs) felgyelett biztost szerkezeteket. Nem annyira hasznlt mint a Bournera pl vltozatok. Jelenleg tcsh nev modern vltozatt hasznljk, s leginkbb a BSD
alap rendszereken felhasznlinl gyakori a hasznlata.
Bash (bash)
A Bash (Bourne again shell) vltozatot eleve nylt forrskdnak kezdtk fejleszteni. A
kompatibilits szempontjbl mind a Bourne, mind Korn shell-t kveti, s sok ezekre rt
szkript lefut mdosts nlkl a bash-en is. Mindhrom elzleg emltett shell-bl vett t
megoldsokat, de fejlesztett sajt nyelvi lehetsgeket is. Modern Linux-okon ltalban ez az
alaprtelmezett shell, s valszn, hogy a leggazdagabb programozsi lehetsgeket ez
nyjtja. A bibliogrfiban emltett "Learning the bash shell" cm knyv rszletesen
bemutatja nyelvi lehetsgeit.
Azt, hogy egy rendszeren melyiket lehet hasznlni, a /etc/shells llomny tartalmbl tudhatjuk
meg. Ez pl. Fedora disztribci alatt az albbi mdon nzhet ki:
$cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/zsh
/bin/tcsh
/bin/csh
/bin/ksh
Lthat, hogy a rendszeren egyszerre tbb shell lehet. A Linux alatt tbbnyire a Bash shell-t
hasznljuk, de a tbbi is ott szokott lenni a gpen. A legtbb programhoz viszont a Bourne shell al
rjk a telept, indt, stb. szkripteket. Az iparban nagyon sok helyen a Korn shell-t hasznljk mint
standardot, ezt standardizlja a POSIX is.
A felhasznl ltal hasznlt alaprtelmezett shell-t a rendszer a /etc/passwd llomny
felhasznlt ler sorban tallja meg.
A tanfolyam sorn igyeksznk klasszikus elemeket hasznlni, amelyek a Bourne s Korn hjakra
plnek. Megemltjk, ha egy-egy jellegzetessget csak a Korn vagy Bash nyjt.
A shell program els sora specilis lehet. Itt adhatunk meg informcit arrl, hogy a szveges
llomnyt milyen rtelmezvel szeretnnk vgrehajtani. Ez gy trtnik, hogy ez a sor egy olyan
megjegyzst tartalmaz, amelyben a ketts keresztet azonnal egy felkiltjel kvet (teht: #!ll ott),
utna pedig a kvnt rtelmez teljes elrsi tja.
2
A vgrehajts teht azt jelenti, hogy elindtjuk a shell-t (s ez egy j shell lesz) gy, hogy
argumentumknt (amelyet bemenetnek hasznl) megadjuk a programot tartalmaz llomnyt.
Amennyiben a bash-t megjell sor hinyzik, a shell megprblja a szveget a felhasznl szmra
belltott alaprtelmezett shell-el vgrehajtani (ennek nevt a $SHELL krnyezeti vltoz
tartalmazza). A kt echo helyn brmilyen hossz szveg llhat, egyms utni parancssorok
amelyeket a shell egyms utn: mindig az elz lefutst megvrva hajt vgre.
Az alias-ok vagy helyettest nevek arra szolglnak, hogy a gyakran hasznlt, tbb kapcsolval
meghvott programoknak egy helyettest nevet adjunk, s gyorsabban, egyszerbben hivatkozzunk
rjuk. Jellegzetes plda a Linuxon az ls parancsot helyettest alias, amely sznes kirssal hvja
meg az ls-t. Ltrehozsa az alias paranccsal trtnik:
$ alias ls='ls --color=tty'
Amint lthat, az alias ltrehozs tulajdonkppen a nvnek egy karakterlncot feleltet meg, s
meghvsakor ez helyettestdik a parancssorra. A helyettest neveknek elsbbsgk van az
ugyanolyan nev parancsokhoz kpest amikor meghvjuk ket.
Trlsk az unalias , listzsuk egyszeren az alias paranccsal trtnik.
$ unalias ls
2. A parancsvgrehajts
Hogyan fut le egy egyszer parancsvgrehajts? Beptett parancsok esetben a fut shell vgzi ezt.
Kls parancsok, azaz programok futtatsa sorn az albbi trtnik:
Amikor a shell elfogadja a parancsot s elindtja, azt mondjuk, hogy egy j folyamat jn ltre: a fut
shell fi folyamata. Amikor a program kdja betltdik, a kdon kvl az opercis rendszer tbb
informcit ltrehoz illetve kvet: ezeket egytt folyamatnak nevezzk. Teht egy fut programot
mindig folyamatknt fogunk emlegetni. A parancsvgrehajtsnl j folyamat keletkezik, amelyben a
shell vgrehajtja a parancsot. Ugyanakkor a fut shell maga is egy folyamat.
Egy parancssoron (az j sor elvlaszt karakterig tart karakterlnc) ltalban egy programot
indtunk el. Megtehetjk, hogy tbbet indtsunk el egyszerre, ha kztk a ; -t hasznljuk mint
elvlaszt jelet.
$ echo "rendezes indul" ; sort szoveg.txt;
echo "vege"
Ilyenkor a msodik parancs megvrja az elst, teht nem prhuzamosan hajtdnak vgre.
A parancssoron elindtott programrl azt mondjuk, hogy "eltrben fut"; mivel a terminlra r, s
ilyenkor a shell nem adja vissza a kszenlti jelet (prompter): azt jelzi ezzel, hogy nem fogad el j
parancsot az elz befejezsig.
Megtehetjk, hogy a parancsot "httrben" futtassuk; ilyenkor a shell visszaadja a kszenlti jelet,
4
3. A shell vltozi
3.1 Az ltalnos shell vltozk
A shell az adatok, informcik trolsra vltozkat hasznl. Mivel a shell parancsai szvegekbl
plnek fel, a vltozk nevt s rtkt is egyarnt sztringekben trolja. A nv-rtk hozzrendelst
egyszeren az = jel segtsgvel adjuk meg. Pldul a
$ szin=piros
sor vgrehajtsa sorn ltrejn az a szin vltoz piros rtkkel. Lthat, hogy a vltoz
ltrehozsa dinamikus: akkor jn ltre amikor deklarlom, nincs szksg elzetes defincira.
Amikor a ltrejtt vltozt ksbb shell parancsok argumentumaiban hasznljuk, egy $ jellel s a
vltoz nevvel hivatkozunk r. Teht $szin lesz a hivatkozott vltoz, s ezt gy hasznljuk:
5
A vltozk teht sztringeket tartalmaznak, gy megtrtnhet az is, hogy nincs rtkk (res sztringet
tartalmaznak).
A vltozk rtkt idzjelek kz is tehetjk, st, ha a vltoz rtke olyan sztring amelyik
elvlaszt karaktert is tartalmaz, akkor ktelezen ezt kell tennnk. Pldul, ha egy vltoz rtke a
piros alma karaktersor, akkor ezt gy kell megadni:
$valt="piros alma"
Egybknt a shell csak a piros sztringet rendeln a vltozhoz s gy rtelmezn, hogy az alma egy
kvetkez parancs rsze.
A vltozk neve az angol Abc betibl (kis s nagybet kzti eltrs szmt) valamint a
szmjegyekbl s a _ alhzsjel karakterbl llhatnak.
lertuk.
A " ketts idz jelet is sztringek deklarlsra hasznljuk. Amikor egy sztringet ketts idzjellel
vesznk krl, akkor a shell a sztring belsejben a vltozk nevt trja, s gy hasznlja fel ket a
tovbbiakban.
$ szin=piros
$ echo "$szin alma"
piros alma
Mivel ilyen esetekben elfordul, hogy a shell nem tudja a vltoz nevt meghatrozni, pldul
albbi esetben, ha a "pirosalma" szveget akarjuk kirni:
$ echo "$szinalma"
(meddig tart a vltoznv? a shell gy fogja rtelmezni, hogy egy j vltoz nevet hasznlunk, a
$szinalma nevt), ltezik egy jellsi md ami ezt egyrtelmv teszi. Ilyenkor a vltoz nevt
jelent karaktereklncot {} zrjelekkel vesszk krl. gy mr egyszer kifejezni a vltozt:
$ echo "${szin}alma"
at
${szin:?hibas szin}
Az albbi kis programban (szin.sh) nem adunk rtket a $szin vltoznak, gy els hasznlatkor
automatikusan felveszi azt:
#!/bin/sh
echo ${szin:=piros}
echo $szin
exit 0
Az echo parancs
Az echo parancs kirja sajt argumentumainak listjt s utna automatikusan egy j sor karaktert.
echo argumentum_lista
$ echo ez egy zenet
ez egy zenet
Kt kapcsolja van:
-n nem r j sor karaktert
-e engedlyezi a kvetkez specilis karakterek rtelmezst a karakterlnc okban:
\a riad (cseng)
\b egy karakter trlse visszafel
\c nem r ki jsor karaktert
\f lapdobs
\n j sor
\r kocsi vissza
\t vzszintes tabultor
\v fggleges tab
\\ backslash
\nnn a karakter ASCII kdja nnn (oktlisan)
\xnn a karakterkdot hexadecimlisan lehet megadni, pl. \x32
Nhny krnyezeti vltozt az albb sorolunk fel. A belltott vltozkat a printenv paranccsal
lehet kilistzni. Pldul az albbi vltozk szinte minden gpen be vannak lltva:
HOSTNAME=eowyn.maros.emte.ro
TERM=xterm
SHELL=/bin/bash
USER=lszabo
MAIL=/var/spool/mail/lszabo
PATH=/bin:/usr/local/bin:/bin:/usr/bin:/home/lszabo/bin:./
PWD=/home/lszabo
EDITOR=/usr/bin/vim
LANG=en_US.UTF-8
HOME=/home/lszabo
LOGNAME=lszabo
Az els sor tlltja (jra deklarlja) a PATH vltozt: a rgi mg odailleszti az elvlaszt
karaktert (:) s utna a pillanatnyi munkaknyvtr nevt, majd az export shell utastssal berja a
krnyezeti vltozk kz, gy, hogy azt az ltalam indtott folyamatok is rkljk.
A bash esetben kilpskor egy .bash_logout nev llomny tartalma rtelmezdik, ebbe
rhatunk be rutin feladatokat, amelyeket kilpskor kell vgrehajtani.
Amikor egy vltozt ltrehozunk (pl. a fenti pldban az j PATH vltozt), ez csak a hj szmra
lesz lthat, a hjbl indul parancsok szmra nem. Az export berja a hjvltozt azok kz a
krnyezeti vltozk kz, amelyeket minden ms ltalam indtott parancs is megkap.
A tbbi specilis vltozt ksbb vezetjk majd be, ahogy hasznlatra kerlnek. Listjukat
megtallhatjuk a Fggelk 2. pontjnl.
5. tirnytsok s csvezetkek
Emlkeztetnk a standard bemenet, kimenet s hibakimenet fogalmra egy fut programnl.
Mindhrmat llomnyknt kezeli a shell (akrcsak a C nyelv). Jellskre egsz szmot tartalmaz
azonostkat hasznl a C nyelv akkor, amikor els szint llomnykezel fggvnyeket hasznl.
9
0 - standard bemenet
1 - standard kimenet
2 - standard hibakimenet.
Ezeket az azonostkat a hj is hasznlja.
5.1 tirnytsok
Az tirnytsok pldinl a sort , cat , head, tail parancsokat hasznljuk. Ezeket laboron
vesszk t, lersuk megtallhat az elads honlapjn.
A hj szintaktikailag nhny szimblumot hasznl a standard bemenet s kimenet illetve
hibakimenet tirnytsra. Ezek hasznlata s jelentse az albbi:
A standard bemenet megvltoztatsa a < jellel: az albbi pldban a sort program bemenete nem
a standard bemenetrl jn, ahogy az a sort egyszer futtatsnl tenn, hanem a lista.txt nev
llomnybl.
sort < lista.txt
A standard kimenet llomnyba irnytsa a > jellel: az albbi pldban a sort program nem a
terminlra, hanem a rendezett.txt nev llomnyba r, de a standard bemenetrl olvas:
$ sort > rendezett.txt
b
a
$ cat rendezett.txt
a
Megjegyzend, hogy a > llomnyba irnyts trli a rgi llomnyt ha ilyen nev mr ltezik.
A kt tpus tirnytst akr egyszerre is hasznlhatjuk:
sort < lista.txt > rendezett.txt
A kimenet hozzfzse egy llomnyhoz a >> jellel: ezzel az tirnytssal hozzfzs mdban
runk a kimeneti llomnyba, teht az llomny tartalma amennyiben ltezik megmarad, s az j
sorok az llomny vgrekerlnek.
$ echo elso > f
$ echo masodik >> f
$ echo harmadik >> f
$ cat f
elso
masodik
harmadik
5.2 Csvezetkek
A csvezetkek az opercis rendszer ltal ltrehozott kommunikcis csatornk, amelyeken
keresztl egy folyamat kimenete egy msik bemenetre irnythat egy rendkvl egyszer
szintaxissal a parancssoron. A deklarlshoz hasznlt jel a | elvlasztjel. Az albbi pldban a
cat kimenett a sort-ba irnytjuk (a sort parancs egyszeren rendezi a bemenetre kerl
szveges llomny sorait s trja a kimenetre - rszletes hasznlatval ksbb foglalkozunk):
$ cat lista.txt | sort
10
Ebben az esetben a sort teljes kimenete nem kerl lementsre, csak a kvnt vgeredmnyt kapjuk
meg.
Itt emltjk meg a tee parancsot, amely sorozatos feldolgozs esetn biztosthatja egy kztes
kimenet elmentst, ha arra ksbb szksg lehet. A tee hasznlata az albbi:
tee [-a] llomnynv
amelynek hatsra a bemenetet a kimenetre s az adott nev llomnyba rja. Az albbi esetben
elvgzdik ugyanaz a feldolgozs mint a fenti pldban, de ezttal a sort ltal ellltott teljes
rendezett lista is elmensre kerl:
$ cat lista.txt | sort |tee rendezett.txt | head -1
>
naplo.txt
2>&1
Ilyenkor nylvn semmit sem ltunk a terminlon, minden kirt szveg (akr eredmny, akr hiba) a
naplo.txt nev llomnyba kerl, s onnan olvashatjuk el ksbb. A parancs lefutst pedig
nyilvn meg kell vrnunk (nincs kszenlti jel csak ha a sort lefutott). Ilyenkor megtehetjk, hogy a
feladatot a httrben futtatjuk (hiszen amgy sem ltunk semmit), az albbi parancsindtssal:
$ sort rendezetlen.txt > naplo.txt 2>&1 &
[1] 5039
$
gy azonnal j paranccsal foglalkozhatunk, nem kell a sort vgre vrnunk. A parancs lefutsnak
eredmnye, hibi pedig egy llomnyban lesznek rgztve: az ilyen llomnyokat amelyeket
ksbbi felhasznlsra rgztnk neveznk naplnak (log file).
Van olyan eset, amikor a kt kimenetet ugyanabba a csvezetkbe szeretnnk irnytani, ezt az
albbi megoldssal rjk el:
$ sort rendezetlen.txt 2>&1
$
cat
> eredmeny.txt
11
Elszr a hibakimenetet a standard kimenetre irnytjuk, majd a standard kimenetet vezetjk egy
csvezetkbe. Utna a csvezetkket egy msik program, jelen esetben a cat bemenetre.
A parancs vgrehajtsa utn (ez brmilyen UNIX parancssor lehet), a shell a parancs bemenett a
sajt programszvegre irnytja (az "itt brmilyen szveg llhat" sorra vagy sorokra), s a parancs
addig olvas innen, amg egy sor elejn ugyanarra a karakterlncra akad, amely a << jel utn ll. Itt
abbahagyja az olvasst, s a shell vgrehajtja a kvetkez soron lev parancsot. Az albbi shell
program (phone.sh) egyszeren kir egy telefonszm listt:
1
2
3
4
5
6
7
8
9
#!/bin/bash
cat << VEGE
Laci
0756-453-675
Peter
0744-456-436
Johanna 0722-567-890
VEGE
echo ez mar nem "here document" kiiras
6. A parancs behelyettests
Parancs behelyettestsnek azt a mveletet nevezzk, amely sorn a shell lefuttat egy parancsot, s a
parancs kimenett (standard kimenet) mint egyetlen karaktersort egy vltozhoz rendel.
Kt jellst hasznlunk erre, egy hagyomnyosat s egy modernebbet.
Hagyomnyos jells:
vltoz=`parancsor`
teht ilyenkor a kt vissza idzjel (back tick) veszi krl azt a parancssort, amelyet futtatunk.
12
A modernebb jells:
vltoz=$(parancssor)
Mindkt jellssel lefuttatott hozzrendels ugyanazt az eredmnyt idzi el. Amint azt tapasztalni
fogjuk, a $() jells jobban olvashat, ezrt ezt ajnlott hasznlni, de a gyakorlatban mindkettvel
ugyanolyan mrtkben tallkozunk.
Az albbi pldban az els parancssor echo kimenete nem a kimenetre kerl, hanem az zenet
vltozba:
$ uzenet=` echo "ez a kiirni valo" `
$ echo $uzenet
ez a kiirni valo
A fenti pldban az echo kimenete egy egy soros karakterlnc volt. Amennyiben nem gy van, s a
kimenet tbb sorbl ll, a shell trja az j sor karakter elvlasztt egy szkz karakterr. Ilyenkor
egy karakterlncokbl ll, szkzzel elltott listt rendel a vltozhoz. Pldul az ls -1 (ez gy
listz, hogy minden egyes llomnynv kln sorba kerl) parancs kimenett vltozba rva egy
llomnynv listt kapunk:
$ ls -1
alma.sh
hello.sh
phone.sh
$ lista=$( ls -1 )
$ echo $lista
alma.sh hello.sh phone.sh
$
7. A parancssor trsa
A shell a parancssort vgrehajts eltt "trja": ha vannak benne olyan szerkezetek vagy
metakarakterek amelyeket a vgrehajts eltt behelyettesthet, akkor megteszi azt.
A metakarakterek olyan karakterek, amelyek mst jelentenek a shell szmra mint bet szerinti
jelentsk.
Egyelre az albbiakkal tallkoztunk:
*
a home knyvtr elrsi tjt jelenti (pl. /home/lszabo/ , ezt rja be a tilda helyett)
jellssel kell megadni vagy aposztrf kz kell zrni ket (gy karakterlncot adunk meg). Egy * ot gy runk ki a terminlra:
$ echo \*
*
$ #vagy:
$ echo '*'
*
14