You are on page 1of 23

Ezt egy egysoros programmal meg lehet oldani

Hatkony szkriptnyelvek Unixon 25 ve s ma


Szab Pter
<szabo.peter@szszi.hu>
Kivonat
A Unix a kezdetekt ol fogva olyan eszkzkkel knyeztette felhasznlit, melyek egytt
lehet ov tettk az ismtl od o feladatok gyors automatizlst, ezzel a Unixot hatkony mun-
kakrnyezett tve a programozk, a programozni szeret o felhasznlk s a rendszerad-
minisztrtorok szmra. Ezen klasszikus eszkzk: a cs ovezetkek s az adatok szveges,
jrabeolvashat trolsi mdja s a szkriptnyelvek megtallhatk a mai Linux rendszereken
is, s a a stabilits s a biztonsg mellett ok is hozzjrulnak a Linux npszer usghez a
programozni szeret ok krben.
A cikk egy vzlatos, forrskd-rszletekkel illusztrlt krkpet vzol fel a ma npszer u
szkriptnyelvekr ol. Clja, hogy a Linux irnt rdekl od ok zelt ot kapjanak az automatizlsi
lehet osgekr ol, belertve azt is, hogy milyen feladatnak milyen nyelvben rdemes neki-
fogni, tovbb hogy szlestse azok ltkrt, akik nhny szkriptnyelvet mr ismernek. A
bemutatott nyelvek egy rsze mr 25 ve is jelen volt (Bourne shell, AWK, sed, Make, C
shell), de jttek modern trnkvetel ok is (Lua, PHP, Perl, Pike, Python, Ruby, TCL).
A cikkben, az egyes nyelvek szintaxist illusztrland, visszatr o motvumknt jelen-
nek meg kett o vagy tbb klnbz o nyelven is m ukd o programok, melyek egy gyakorlati
hasznra (az interpreter elrsi tvonaltl fggetlen #! shebang) is fny derl.
Tartalomjegyzk
1. Szkriptnyelvekr ol ltalban 146
2. Rgi nyelvek 149
2.1. Bourne shell : Unix folyamatok integrcija . . . . . . . . . . . . . . . . . . 149
2.2. C shell : a Bourne shell alternatvja . . . . . . . . . . . . . . . . . . . . . . 151
2.3. Make: inkrementlis szoftverfordts . . . . . . . . . . . . . . . . . . . . . . 152
2.4. sed: stringm uveletek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
2.5. AWK: stringm uveletek strukturlt programban . . . . . . . . . . . . . . . . 155
3. Mai nyelvek 156
3.1. PHP: knnyen elsajtthat webprogramozs . . . . . . . . . . . . . . . . . 157
3.2. Perl : svjcibicska minden rendszeren . . . . . . . . . . . . . . . . . . . . . 158
3.3. Python: jl olvashat, objektumorientlt szkriptek . . . . . . . . . . . . . . . 160
3.4. Ruby: a programozk kedvence . . . . . . . . . . . . . . . . . . . . . . . . 161
3.5. Pike: webprogramozs C-szer u szintaxissal . . . . . . . . . . . . . . . . . . 162
3.6. TCL: grakus felleteket gyorsan . . . . . . . . . . . . . . . . . . . . . . . 163
3.7. Lua: letisztult, begyazott szkriptnyelv . . . . . . . . . . . . . . . . . . . . . 165
146 Szab Pter
1. Szkriptnyelvekr ol ltalban
A szkriptels [14] egy olyan szoftverfejlesztsi fzist jelent, melyben a mr ltez o, klnfle
komponenseket kapcsoljuk ssze egy j feladat megoldsa rdekben, a szkriptnyelv pedig
egy olyan (ltalnos vagy specilis cl) programozsi nyelv, melyen a szkriptels trtnik, a
szkript pedig a szkriptels sorn el oll program (forrskdja). A szkript eredeti angol meg-
felel oje sznpadi szvegknyvet, forgatknyvet jelent, utalva arra, hogy az is pontosan lerja,
hogy kinek mikor mit kell tennie.
Szkriptelhet o lehet pldul egy stratgiai jtk, melynek ltez o komponensei az egyes
pleteket, jrm uveket s az ellensges katonkat vezrl o szoftverdarabok, s ezeket szkrip-
telssel sszekapcsoljuk gy, hogy egytt, sszehangoltan megvalstsk a jtk egy plyjt.
A Quake 3D lvldz os jtk (FPS) egyike volt az els o olyan jtkoknak, melynek egy rsze
szkriptnyelven rdott. A fejleszt ok dokumentltk, hogyan lehet a jtkot szkriptelni, gy
brki szmra lehet ov vlt sajt ellensgek, plyk stb. ltrehozsa. A Quake sajt, specilis
cl szkriptnyelvet hasznlt, a QuakeC-t. A mai, szkriptelhet o jtkok krben egyre npsze-
r ubb a Lua begyazott programozsi nyelv, melyr ol a 3.7. szakaszban rszletesen szlunk.
Unix rendszereken a szkriptels f oleg ismtl od o feladatok automatizlsra hasznlatos.
A szkript ltalban egy sszetett feladatot hajt vgre, a kongurcis fjlokban s a parancs-
sori paramtereiben megadott paramterekkel, a ltez o unixos szoftverek felhasznlsval,
sszekapcsolsval. A Unix-loza [17] rsze, hogy az egyes programoknak olyan sz-
veges kimenetet kell produklniuk, melyek nem csak ember szmra olvashatak, hanem
knnyen feldolgozhatk ms programmal. Annak idejn a Unixokon vlt npszer u a cs ove-
zetk fogalma. A cs ovezetk (angolul pipe) lehet ov teszi, hogy egy folyamat a kimenett
ne a terminlra vagy fjlba rja, hanem kzvetlenl egy msik program bemenetre kldje.
Az sszekapcsols folytathat: a msik program is cs ovezetken kldi tovbb kimenett egy
harmadiknak stb. Cs ovezetk-hlzatok (angolul pipeline) szkriptels segtsgvel knnyen
kialakthatk. Megjegyezzk, hogy programokat nemcsak cs ovezetken lehet sszekapcsolni
(hanem pldul kliensszerver architektrban), ez azonban Unix alatt krlmnyesebb, mint
az egyszer u cs ovezetk. Unixon nem csak rendszeradminisztrcis szkriptek vannak, hanem
a programozni szeret o felhasznlk gyakran sajt munkjukat automatizljk szkriptelssel.
Egy ltalnosabb, laza denci szkriptnyelvnek tart minden olyan programozsi nyelvet,
melynl fordts s linkels nem szksges (teht a forrskd elksztse utn kzvetlenl
futtathat), tovbb a nyelv s a hozztartoz programknyvtrak bizonyos feladattpusok
programozst jelent osen leegyszer ustik ms nyelvekhez kpest. F o eltrs az el oz o, kompo-
nensintegrcis dencihoz kpest, hogy a laza denci megengedi egyetlen komponensb ol
ll szoftverek ksztst az adott szkriptnyelven.
Cikknk a Unixon hasznlt legelterjedtebb szkriptnyelveket trgyalja ezeken fel is
tbb tucat egyb, szles krben hasznlt szkriptnyelv ltezik Unixra. A trgyalt nyelvek list-
ja az els o verzi kiadsnak vvel s WikiPedia-beli [19] cmszavukkal egytt mutatja az 1.
tblzat. Kln meg vannak jellve azok a nyelvek, melyek csak a laza denciba frnek be-
le. A trgyalt nyelvek mindegyiknek ltezik szabad szoftver implementcija, s tbbnyire
egyetlen ilyen implementci terjedt el.
Interpretlt nyelvek

Programozsi nyelvek kztt klnbsget szoks tenni a forrs-
kd beolvassa szerint. Az n. tiszta interpretlt nyelvek esetn (a cikkben trgyaltak kzl a
Bourne shell s C shell) egy utasts beolvassa utn az rgtn vgrehajtdik, s a kvetkez o
utasts beolvassa csak ezutn kvetkezik. Az egyb interpretlt nyelvek az egsz forrsfjlt
beolvassk (s esetleg bjtkdot vagy vgrehajtsi ft ptenek), majd a kd memriabeli,
teljesen felptett vltozatt hajtjk vgre. A vgrehajts interpretlt, vagyis a programot a
CPU nem kzvetlenl hajtja vgre, hanem egy olyan segdprogramot, n. interpretert futtat,
amely vgigmegy a program utastsainak memriabeli reprezentcijn, s minden utasts-
Hatkony szkriptnyelvek Unixon 147
1. tblzat. Elterjedt szkriptnyelvek Unixon
25 ve is megvoltak:
Bourne shell 1977 http://en.wikipedia.org/wiki/Bourne
_
shell
AWK 1977 http://en.wikipedia.org/wiki/AWK
_
programming
_
language
C shell 1979 http://en.wikipedia.org/wiki/C
_
shell
Make 1977 http://en.wikipedia.org/wiki/Make
sed

1974 http://en.wikipedia.org/wiki/Sed
jkelet uek, aktv fejleszts alatt llnak:
Lua 1994 http://en.wikipedia.org/wiki/Lua
_
programming
_
language
PHP

1995 http://en.wikipedia.org/wiki/PHP
Perl 1987 http://en.wikipedia.org/wiki/Perl
Pike

1994 http://en.wikipedia.org/wiki/Pike
_
programming
_
language
Python 1990 http://en.wikipedia.org/wiki/Python
_
%28programming
_
language%29
Ruby 1995 http://en.wikipedia.org/wiki/Ruby
_
%28programming
_
language%29
TCL

1988 http://en.wikipedia.org/wiki/Tcl
komponensintegrcira nem hasznlatos
nl az utasts tpusnak megfelel oen gazik el. Ezzel szemben n. fordtott (angolul compi-
led) vgrehajts esetn a fordtprogram (angolul compiler) az architektrnak megfelel o, a
CPU ltal kzvetlenl vgrehajthat kdot llt el o (az n. binrist), a futtatshoz csak erre
van szksg, a forrskdra nem. A fordts igen id oignyes, pldul a Linux kernel egy mai
modern PC-n kb. 15 perc alatt lefordul, aprbb eszkzk fordtsa is ignybe vehet nhny
msodpercet. A cikkben trgyalt nyelvek egyt ol egyig interpretltak. Fordtott nyelvre plda
a C, a C++ s a Delphi, s fordts trtnik C# s a Java esetn is.
Az interpretls gyorsabb betltst s lassabb vgrehajtst tesz lehet ov, mint a fordts.
Egy interpretlt program les vltozatnak futtatsakor felmerl az igny a nagyobb sebes-
sgre. Erre vannak klnbz o technikk (bjtkd, futs el otti fordts (JIT), beolvass utn
cache-els), m a gyorstott vgrehajtsi sebessg is gyakran elmarad az azonos cl, eleve
fordtott programok sebessgt ol.
Sok interpretlt nyelvre jellemz o (s a legtbb fordtott nyelvre nem) az automatikus me-
mriafelszabadts, vagyis hogy a futtatkrnyezet a hasznlaton kvli memrit felszaba-
dtja. Ennek tipikus eszkzei a hivatkozsszmlls s a szemtgy ujts. Az automatikus me-
mriakezels egyszer usti a programkdot, de a plusz adminisztrci miatt lasstja a futst.
Nagy szoftverek szkriptben

A szkriptnyelvek teht tbb szempontbl segtik a gyors
szoftverfejlesztst (pl. jl hasznlhat programknyvtrak, specilis cl nyelvi elemek, a
gyors jraindts az interpretltsg miatt). Vigyzni kell azonban, mert ha a nagy kdolsi
sietsgben nem gyelnk a forrskd min osgre, egy bizonyos mret fltt a kd rthetet-
lenn, karbantarthatatlann vlik. A szkriptnyelveket sok kritika ri, hogy knny u bennk
rossz min osg u kdot rni. E sorok rja (a trgyalt szkriptnyelvek kzl) 1000 sor fltt nem
ajnlja a Bourne shellt, a C shellt s a sedet, 10000 sor fltt pedig az AWK-t, a Make-et s
a TCL-t. A tbbi nyelv (Lua, PHP, Perl, Pike, Python s Ruby) megfelel o eszkzket knl
nagy szoftverek fejlesztshez. A lehet osg persze nem garancia: klnsen Perlben, PHP-
ban s Lua-ban kell tudatosan lasstani s odagyelni kdols kzben Python, Ruby s Pike
esetn ltalban termszetesebben, kevesebb odagyelssel kszl a j min osg u kd. A leg-
nagyobb Perl-modulgy ujtemnybe, a CPAN-be [5] kerl o modulok legtbbje kes pldja a
j min osg u Perl-kdnak.
Egysoros szkriptek

A cikk cmben szerepl o felkilts (ezt egy egysoros programmal
meg lehet oldani !) lehetne akr a tapasztalt, hatkonyan dolgoz Unix-felhasznlk jelmon-
148 Szab Pter
data.

Ok ugyanis a napi feladataik sorn nemcsak gyakran hasznlnak, hanem gyakran rnak
is szkripteket, sokszor igen rvid, 80 karakteren elfr o egysorosakat, mindig a megfelel o
szkriptnyelv(ek)en. Vegyk pldul azt a feladatot, hogy meg kell tallni a legtbb helyet
foglal felhasznlt. Ez az albbi paranccsal megoldhat
1
:
$ du -sk /home/
*
| sort -rn | less
A fenti parancs a felhasznlkat a home knyvtruk mretnek cskken o sorrendjben je-
lenti meg. A hasznlt szkriptnyelv a Bourne Shell, amely elvgzi a /home/
*
kifejtst, s
hrom programbl ll cs ovezetk-hlzatot hoz ltre (a parancsbeli | karakterek mentn).
Elkpzelhet o azonban, hogy egyes felhasznlk home knyvtrai nem kzvetlenl a /home-
on bell tallhatk (pl. /home/tanar/hannibal). A javtott megolds, ami a /home alknyv-
traiban tallhat home knyvtrakat is megjelenti, a kvetkez o:
$ </etc/passwd awk -F: $6~/^\/home\//{print$6} |
xargs du -sk | sort -rn | less
(A parancs pp 80 karakter lett.) Ha a felhasznli adatok NIS-adatbzisban tallhatk, akkor
</etc/passwd helyett ypcat passwd | rand. Trolsfggetlen megolds is ltezik, itt
getent passwd |-re kell cserlni. Ha a getent parancs nem elrhet o, akkor a megolds
Perlben:
$ perl -le while(@L=getpwent){print$L[7]if$L[7]=~/^\/home\//} |
xargs du -sk | sort -rn | less
A fenti hrom megolds jl pldzza a unixos gyors problmamegolds menett. A gya-
korlott felhasznl ismeri a hasznlhat eszkzket (du, sort, less, xargs stb.) s a szkript-
nyelveket (Bourne Shell, AWK, Perl stb.), s tprengs nlkl, folyamatosan rja be a cs ove-
zetk-hlzatot ltrehoz shell-parancsot. (Esetleg a manban utnanz a programok kapcso-
linak.) Majd, ha a parancs nem pont azt csinlja, amit kne, akkor mdost rajta (pl. szksg
esetn ttr AWK-rl Perlre).
E cikknek nem clja, hogy minden kdrszletet teljes mrtkben megmagyarzzon. Ha
valaki a rgebbi eszkzk (Bourne shell, AWK, Make, sed) tmr, vel os trgyalsra kvn-
csi, olvassa el a klasszikusnak szmt [9]-et, vagy egyszer uen Linux alatt olvassa el a meg-
felel o kziknyvoldalt (angolul man page) : bash(1), mawk(1), sed(1), Make esetn pedig az
Info oldalt (info make paranccsal). A modern szkriptnyelvek mindegyikhez van tutorial,
megtekinthet o az adott nyelv honlapjn.
Kvlllk elfogadhatatlanul nagynak tallhatjk azt az er ofesztst, amivel el lehet jutni
arra a tuds- s kszsgszintre, hogy a fentiekhez hasonl egysoros parancsok gpelse fo-
lykonyan trtnjen. Alternatv megoldsnak javasolhatjk a grakus menedzsment-felletek
hasznlatt (pl. Vezrl opult), kattintgatni vgl is sokkal kevesebb tudssal is lehet. Vannak
azonban htrnyai is a grakus felleten trtn o munknak:
Egy grakus fellet felhasznlja nem lvez teljes szabadsgot : elkpzelhet o pldul,
hogy az o felletn nincs olyan funkci, mellyel a felhasznlt trterlet cskken o sor-
rendjben fel lehet sorolni a felhasznlkat. Ekkor vagy egyenknt, kzzel vgignzi az
sszes felhasznlt (sok, rtelmetlenl elvesztegetett id o), vagy lekrdez minden adatot
a felhasznlkrl, majd egy grakus tblzatkezel ovel feldolgozza az eredmnytblt
(mg ez is jval lassabb a szkriptelsnl).
Mennyire nvekszik az id o, ha ugyanezt az informcit tvolrl, lass kapcsolaton kell
megszerezni ? A tvoli grakus felleten val kattintgats rkig is eltarthat, mg pl. a
szkriptek knnyedn futtathatk SSH-n keresztl.
1
a kezd o dollrjel a promptot jelli ne gpeljk be
Hatkony szkriptnyelvek Unixon 149
Ha a vezet osg naponta jelentst kr a foglalt trterletr ol, akkor a grakus felleten
dolgoz alkalmazottra ez minden nap plusz terhet r, mg a Unix alatt szkriptel o rutinos
felhasznl 1 perc alatt megrja a szkriptet, s mg 5 perc, amg ltrehozza a cron jobot,
ami gondoskodik a szkript estnknti lefuttatsrl, s az eredmny e-mailes elklds-
r ol a vezet osg szmra.
Ha az adott grakus felletnek j verzija jelenik meg, sok minden mshol lesz rajta,
az alkalmazi tuds egy rsze elavul, a szoksos munkamenetet jra s jra ki kell dol-
gozni. A unixos eszkzk s a Unix alatt hasznlatos programnyelvek viszonylag las-
san vltoznak: az 1975-ben rt shell-szkript kevs vltoztatssal ma is futtathat (a du,
xargs s trsai mr akkor is megvoltak), s az 1995-ben rt Perl-szkript is szinte ugyan-
gy m ukdik ma is, mint rsakor. A szkripteket r Unix-felhasznl teht szmthat
arra, hogy az egyszer megszerzett tudsnak, kszsgeinek vtizedek mlva is hasznt
veszi, s nem kell vente fellrnia oket j ismeretekkel. Tovbb lehet osge van lassan,
fokozatosan tanulni, a Unix hasznlatnak egyre hatkonyabb mdjait elsajttani.
2. Rgi nyelvek
A rgi nyelvek kzs tulajdonsga, hogy az 1970-es vek Unix rendszereihez fejlesztettk
oket, egyszer uek, manapsg is elrhet ok szinte minden Unixon, s a sok implementcinak
van egy szles krben elfogadott metszete, egy rsznyelv, mely minden implementciban
azonosan m ukdik.
2.1. Bourne shell: Unix folyamatok integrcija
A shell (magyar fordtsban burok vagy hj) az a program, amely bejelentkezskor s ter-
minlablak nyitsakor elindul, feladata a felhasznli parancsok fogadsa (a sor szerkesztse
s a korbban kiadott parancsok visszaadsa), a parancsok vgrehajtsa (tirnyts, fjlne-
vek kiegsztse
*
-ra s?-re, cs ovezetkek ltrehozsa, kls o program(ok) futtatsa), s az
indtott programok vezrlse (angolul job control ; httrbe raks, el otrben fut program
kivlasztsa).
Egy egyszer u parancs kiadsakor a shell a szkzk mentn argumentumokra bontja,
az els o argumentumot a program nevnek veszi, s a programot elindtja (szksg szerint
megkeresve a $PATH-on), tadva neki a tovbbi argumentumokat. Vannak a shellnek bels o
parancsai is (pl. echo, ami kirja argumentumait), ezeket o maga hajtja vgre kls o parancs
meghvsa nlkl. Az elindtott program alaprtelmezsben a terminlrl r s onnan olvas,
s a hibazeneteket is a terminlra rja. A program ltal kilpskor visszaadott sttuszkd a
shellt ol lekrdezhet o. A shellben lehet osg van ezek tirnytsra, pldul a Bash shell a
foo <be >>ki 2>/dev/null parancs hatsra a foo programot futtatja gy, hogy az a be
fjlbl olvasson, a ki fjl vgre f uzze hozz kimenett, s hibkat a /dev/null-ra rja (amit
a Unix eldob). A shell ezen fell mg kiegszti (angolul globbing) a fjlneveket, gy pldul
a a foo ?a
*
parancsot futtats el ott kifejti foo bar ba tart-t, ha az aktulis knyvrban
bar, ba s tart azok a fjlok, melyeknek msodik bet uje a.
A shell nem csak egyszer u parancsot fogad el, hanem ezekb ol | karakterrel sszef uztt
cs ovezetk-hlzatot is (s az egyes programok elindtsrl, ki- s bemenetk sszekapcso-
lsrl o gondoskodik), tovbb vannak vezrl oszerkezetek (pl. if, while), s egyes shellek-
ben fggvnyeket rhatunk (a fggvny egyetlen sttuszkdot adhat vissza, ami nemnegatv
egsz szm). A shell kezel string tpus vltozkat, melyek parancsok ptsekor (ltalban $
utn) behelyettest odnek. Az jabb shellek (pl. Bash), ellenttben az eredeti Bourne shellel,
egydimenzis tmbket is kezelnek, s egsz szmokkal is tudnak szmolni.
Az els o Bourne shell a kezdeti unixos shellekb ol lesz urt tapasztatok utn keletkezett 1977-
150 Szab Pter
ben. A mai Linux rendszerek alaprtelmezett s egyben legelterjedtebb shellje, a Bash fell-
r ol kompatibilis az eredeti Bourne shellel. Az jabb shelltpusok (pl. Korn shell s Zsh) is
ilyenek, de egymstl is vettek t nyelvi elemeket. Az ash egy apr, az eredeti Bourne shell
szolgltatsait megvalst shell, interaktv parancsbevitelt knyelmess tev o rutinok nlkl
idelis telept okszletek, RAM-bl fut begyazott rendszerek shell-szkriptelshez (pl.
BusyBoxban [4]).
Mint emltettk, a Bourne shell tiszta interpretlt. Emiatt egy hosszan fut, fejleszts alatt
ll szkript futsa kzben el ofordulhat, hogy mdosul a forrsfjl, s a shell a kvetkez o
utastst mr az j fjlbl akarja venni. Ez ltalban nem kvnatos. Megel ozhetjk, ha a
szkript rdemi rszt krbevesszk if true; then . . . exit; fi-vel.
Stringkezels

Az sszef uzsen kvl az sszes tbbi stringkezel o m uvelet shellben igen
keserves, pldul egy olyan eljrst, ami a V vltozban az aaa stringet felvltva bbb-re s
ccc-re cserli, tl krlmnyes csak bels o parancsokkal megrni. Az albbi megolds nem
m ukdik minden Bourne shellben, de megy Bash-ben, Zsh-ban s pdksh-ban:
repaaa() {
local X="$V" Y=bbb Z="${V#
*
aaa}"; V=""
while [ "$Z" != "$X" ]; do
V="$V${X%aaa$Z}$Y"
if [ "$Y" = bbb ]; then Y=ccc; else Y=bbb; fi
X="$Z"; Z="${X#
*
aaa}"
done
V="$V$X"
}
Ugyanez Perlben sokkal rvidebb, gyorsabb, s jval kevesebb gondolkodssal el oll :
sub repaaa() { my $C=1; $V=~s/aaa/($C^=1)?"bbb":"ccc"/ge }
A Bourne shell teht remek eszkz tirnytsra, valamint kls o programok integrlsra
cs ovezetk-hlzatokkal s egyszer u vezrlessel, m nehzkess vlik, amikor stringkezels-
re vagy szmolsra kerl sor. Tovbbi problma, hogy a shell-szkriptek igen lassak. A fenti
problms esetekben rdemes ttrni pl. Perlre; Perlben ugyanis a megfelel o kiegszt o
modulokkal minden feladatot meg lehet oldani, s csak slyos CPU- vagy memriansg
esetn kell Perlr ol valamely fordtott nyelvre vltani. (zls szerint Perl helyett egyb modern
szkriptnyelvvel is dolgozhatunk.)
Kalandos kedv uek kiprblhatjk a Bash helyett a Zsh nev u shellt, amely szmos el onyt
tvzi a Bourne, a C s a Korn shellnek. A legfontosabb el onyei a Bash-sel szemben: interak-
tv lehet osgei (prompt, fjlnv-kiegszts) jobban testreszabhatk, egyszerre tbb kimeneti
fjlba is t tud irnytani, tovbb a
**
mintval az alknyvtrakat (rekurzvan) is ki tudja
egszteni. Mindezek olyan szolgltatsok, melyek knyelmesebb, hatkonyabb teszik a
mindennapi munkt. A Zsh htrnya pldul, hogy csak a legjabb verzik m ukdnek jl
UTF-8-as terminlon.
Shell-szkriptek rsa

A shell hasznlata esetn szinte szrevtlenl vlik a felhasznl
programozv. Pldul a 148. oldalon tallhat listz parancsot (amely a home knyvtr-
beli helyfoglalst szerint rendez), knnyen szkriptt alakthatjuk:
#! /bin/bash --
# Hasznlat: listaz.sh [<hossz>]
# a foglalt terlet szerinti cskkeno sorrendben listzza ki a
# felhasznlk home knyvtrait. Csak az elso <hossz> db knyvtrat
# mutatja (vagy 20-at, ha nincs <hossz>).
Hatkony szkriptnyelvek Unixon 151
</etc/passwd awk -F: $6~/^\/home\//{print$6} | xargs du -sk |
sort -rn | head -"${1:-20}"
A szkriptet futtathatv ttele (chmod +x listaz.sh) utn a ./listaz.sh 3 paranccsal
prblhatjuk ki.
A Bourne shell a # jelt ol gyelmen kvl hagyja a sorok tartalmt, gy megjegyzs helyez-
het o el. A "${1:-20}" kifejezs pedig a szkript els o argumentumt ($1) adja vissza, vagy
annak hinya (vagy ressge) esetn 20-at.
A fjl els o, #!-lel (az n. shebang-gel) kezd od o sort a Bourne shell a # jel miatt -
gyelmen kvl hagyja, m ez a sor nem flsleges: a kernel szmra azt rja el o, hogy az
adott fjl futtatshoz egy kls o programot kell indtani teht a ./listaz.sh 3 parancs
helyett /bin/bash -- ./listaz.sh 3 fog lefutni, vagyis a Bash interpreter fogja futtatni
a ./listaz.sh shell-szkriptet az egyelem u 3 argumentumlistval. Ez pont az, amit szeret-
nnk.
Rendszerm ukdtet o shell-szkriptek Linuxon

/etc/init.d/
*
: a szolgltatsokat indt s lellt szkriptek,

*
.ebuild: Gentoo disztribciban a csomagksztst s -fordtst vezrl o szkriptek
(Bash alap, sajt keretrendszerrel).
preinst, postrm stb. : Debian-alap disztribcik csomagjainak felraksakor s lesze-
dsekor lefut szkriptek.
/etc/cron.
*
/
*
: a cron ltal periodikusan (naponta, hetente stb.) futtatott rendszerkar-
bantart szkriptek.
A 2.4-es Linux kernelben a make menuconfig-ra lefut kernelfordts el otti kongur-
l program is shell-szkript volt.
A Debian telept oje is sok egyedi shell-szkriptet tartalmaz.
A Knoppix Linux LiveCD indulsakor shell-szkriptek vezrlik a hardverfelismerst stb.
GNU-s szabad szoftverek lefordtsban is sok shell-szkript vesz rszt (AutoConf, Au-
toMake, LibTool, lsd mg [7]), a fordts el ott lefut configure szkript is Bourne shell-
szkript : ot az AutoConf generlja a configure.in s egyb fjlokbl M4 makrnyelv fel-
hasznlsval.
2.2. C shell: a Bourne shell alternatvja
A C shell a Bourne shell egyik el odjb ol fejl odtt ki, mert akkoriban az el odb ol szmos
knyelmi elem hinyzott : indtott programok vezrlse, parancstrtnet (angolul command
history), korbbi parancsok felhasznlsa (angolul history substitution), tmbkezels, ho-
me knyvtrok kifejtse -re, lnevek (angolul alias), szmols, fjlnv-kiegszts Tab-bal.
Ezek manapsg a Bash-ben mind megvannak, ezrt a C shell vlasztsa nem jr szmottev o
el onnyel.
Unixra a legelterjedtebb, tovbbfejlesztett implementci a tcsh.
A C shell a C nyelvr ol kapta a nevt, mert szintaxisa a C nyelvhez hasonl (ami ki-
csit knnyebben olvashat, mint a Bourne shell-szkriptek) Ezrt az apr eszttikai el onyrt
azonban nagy rat zetett : nem tudja futtatni se a Bourne shellre, se a Bourne shell el odjre
rt szkripteket. A C shell teht megosztja a shell-szkriptek fejleszt oit : vagy Bourne shellre
fejlesztenek, ami minden Unixon futtathat, vagy C shellre, ami sokkal kevsb ismert s
152 Szab Pter
hasznlatos (manapsg a legtbb Linux-disztribci nem rak fel alapbl C shell implement-
cit). Emiatt tbbnyire Bourne shell-szkriptek szletnek.
A C shellt szintaxisban lev o precedencia miatt kritika rte. Pldul az
if ( ! -e foo ) echo bar >foo
utastsban a >foo tirnyts akkor is vgrehajtdik (res fjlt hozva ltre), ha a felttel nem
teljesl.
C shell s Bourne shell sztvlasztsa

Manapsg a /bin/sh ltalban egy Bourne
shellre mutat (Linux alatt a Bash-re, begyazott Unixokon ltalban a BusyBox-ba [4] ptett
ash-ra). Csak vtizedekkel ezel ott volt szoks egyes rendszereken C shellt berakni /bin/sh-
nak. Ma mr nem szksges teht, hogy a #! /bin/sh shebanggel kezd od o shell szkriptek
felkszljenek, hogy esetleg Bourne shell helyett C shellben futnak.
m a lnyesen eltr o szintaxis ellenre kis trkkzssel elrhet o, hogy ugyanaz a
szkript fusson mindkt shelltpusban. Persze csak a legeleje fut mindkett oben: a kd egy el-
gazssal kezd odik, amely vagy a csak Bourne shellben, vagy a csak C shellben m ukd o
rszre ugrik. A helyzetet bonyoltja, hogy mr az elgaz utasts (if) szintaxisa is lnyege-
sen klnbzik a kt shelltpusban. Azrt van megolds:
eval (exit $?0) && eval #\
echo Ez csak Bourne-kompatibilis shellben, pl. ash, bash, ksh, zsh; exit
echo Ez csak C shellben
A sztvlaszts azon alapul, hogy a $?0 C shell esetn 1-et ad vissza, mg Bourne shell esetn
00-t (feltve, hogy a legutoljra befejez odtt parancs sttuszkdja 0). A tbbi utasts (eval
s exit) s szintaktikai elem mindkt shellben ugyanazt csinlja.
2.3. Make: inkrementlis szoftverfordts
A Make nyelv tbb, egymstl fgg o m uveletre bonthat munka lerst teszi lehet ov. Ilyen
munka pldul egy szoftver lefordtsa (fordts: forrsfjlokbl objektumfjlok ksztse,
majd linkels: az objektumfjlokbl binris linkelse, majd a dokumentci generlsa) vagy
egy L
A
T
E
X-dokumentum lefordtsa (pl. forrs DVI PostScript). A lers alapjn a Make
program (Linux rendszereken ltalban a GNU Make) az egyes m uveleteket automatikusan
sorrendezi : ha egy B m uvelet fgg az A m uvelett ol, akkor a sorrendben A meg fogja el ozni B-
t. Ezutn a Make a kialaktott sorrendben vgrehajtja a m uveleteket. A Make inkrementlisan
dolgozik: ha a munka elvgzse utn nhny fjl megvltozik (melyekt ol fgg a munka ered-
mnye), s jrafuttatjuk a Make-et, akkor csak azokat a m uveleteket hajtja vgre, melyekre a
megvltozott fjlok hatssal vannak. Ily mdon egy szoftverfejleszts (mdosts, lefordts,
kiprbls) sorn lervidthet o a fordtssal tlttt id o, ha azt Make-kel vgezzk: ugyanis
csak a megvltozott fjlok (s a t olk fgg o esetleges egyb fjlok) kerlnek jrafordtsra.
Az id onyeresg manapsg is szmottev o: nem mindegy, hogy 500 db C++ fjlbl 1-et vagy
500-at kell jrafordtani, ha egy fjl fordtsa 2 msodpercig tart.
A Make ltal vgrehajtand m uveleteket szablyok rjk le. Plda szablyra:
# A harmadik sort tabultorral kell kezdeni.
foo.o: foo.c foo.h bar.h
gcc -c -o foo.o foo.c
A fenti szably jelentse: ha a foo.o fjl nem ltezik, vagy rgebbi, mint a foo.c, foo.h s
bar.h fjlok brmelyike, akkor a gcc -c -o foo.o foo.c shell-paranccsal ksztend o el
e fjlokbl a foo.o j vltozata.
A Make-rt szerz oje 2003-ban ACM Software System Award djban rszeslt [1].
Hatkony szkriptnyelvek Unixon 153
A GNU Make implementci szmos kiegszt o szolgltatst nyjt : string tpus vltozk
kezelse, stringm uveletek, preprocesszor (a Makele egyes sorainak feltteles kihagysa),
fggvny kls o parancs hvsra (a parancs kimenett stringknt adja vissza), szably az
sszes adott kiterjeszts u fjlra, vltozk fellbrlsa parancssorbl stb.
A Make fontos szerepet kap a GNU szoftverek fordtsban [7]. Egy GNU szoftver for-
dtsa gy trtnik:
1. Az els o lps a forrskd letltsve s kicsomagolsa.
2. A./configure parancsot kell futtatni (szksg esetn a fordtst befolysol argumen-
tumokkal, pldul a teleptsi clknyvtrral s a hasznland programknyvtrakkal
kiegsztve), amely nagy vonalakban ezt teszi : detektlja a rendszer nhny jellem-
z ojt (melyik fggvny melyik .h fjlban s melyik programknyvtrban rhet o el),
felderti a fgg osget a fordtshoz szksges forrsfjlok kztt, majd legenerlja a
Makefile.in-b ol a Makefile-t (a Make szmra) s a config.h.in-b ol a config.h-
t (a C fordt szmra).
3. A make parancs a Makefile-ban tallhat szablyokat kvetve leveznyli a szoftver
lefordtst.
4. A rootknt kiadott make install parancs telepti (felmsolja) a lefordtott szoftvert.
A Make-et hasznljk mg a Linux kernel fordtsra, a NIS felhasznl-adatbzis friss-
tsre, Debian-csomagoknl a program fordtsra s a csomag klnbz o fjljainak elksz-
tsre is. L
A
T
E
X-dokumentumok Make-kel automatizlt fordtsra nincs ltalnosan elfoga-
dott sma, a szerz ok szksg esetn egyedi Makefile-okat rnak.
Nem vletlen, hogy a fgg osgek feldertst nem a Make, hanem a configure szkript
vgzi. Erre ugyanis a Make nem kpes. Tovbbi htrnya a Make-nek, hogy krkrs fgg o-
sgek esetn hibt jelez (pl. L
A
T
E
X-dokumentumok tbbmenetes fordtsakor tipikus a krk-
rs fgg osg), s nem tmogatja az elosztott fordtst sem (vagyis nem lehetsges egy nagy
szoftvert tbb gpen, prhuzamostva fordtani).
A fenti problmk orvoslsra szmos szoftver szletett [15], pldul dmake (elosztott
fordtst tmogat, az OpenOfce.org fordtshoz hasznljk), Ant (Javaban, f oleg Java-prog-
ramok fordtsra), SCons (Pythonban), PBS (Perlben), Rake (Rubyban).
Hordozhat Make shebang

A Make alapesetben az aktulis knyvtr Makefile-jbl
olvassa a szablyokat. Ezt -f kapcsolval brlhatjuk fell. A #! /usr/bin/make -f she-
bang segtsgvel elrhet o, hogy a Make-szablyokat tartalmaz fjl kzvetlenl futtathat
legyen. De mit tegynk, ha a make parancs elrsi tjt nem ismerjk (lehet pldul /usr/
local/bin/make is) ? Futtassuk a szkriptet #! /bin/sh shebang-gel, s bzzuk a shellre az
elrsi tvonal megtallst. Igen m, de ekkor gy kell a fjl els o nhny sort megrnunk,
hogy shell-szkriptknt s Make-szablyfjlknt is m ukdjn. me a megolds, kezdjk gy a
szablyfjlt :
#! /bin/sh
#\
eval (exit $?0)&&eval \
M=make;>/dev/null type -p gmake&&M=gmake;exec "$M" -f "$0" ${1+"$@"}; \
>/dev/null which gmake&&exec gmake -f "$0" $argv:q;exec make -f "$0" $argv:q
# Dont touch lines 1--6: http://www.inf.bme.hu/~pts/Magic.Make.Header
A fenti megolds el oszr a gmake parancsot keresi (hasznos pldul FreeBSD-n, ahol
a make parancs a BSD Make-jt futtatja, a gmake pedig a GNU Make-et), majd a make-et.
154 Szab Pter
M ukdik Bourne s C shellben is (a mr ismert $?0-s trkkel vlasztva szt a kt shellt). A
shell s a Make sztvlasztsnak alaptlete az, hogy a #\-t tartalmaz sor shellben egysoros
megjegyzs, Make-ben viszont a kvetkez o sorban folytatd megjegyzs. Teht a Make a
fenti egsz fejlcet megjegyzsnek tekinti, gyelmen kvl hagyja.
Megjegyezzk, hogy azrt kell Bourne s C shell esetn ms kdot futtatnia a fejlcnek,
mert a kapott argumentumok tovbbadsa mshogy trtnik (Bourne shell esetn a hordoz-
hat megolds a ${1+"$@"}, C shell esetn pedig a $argv:q).
Van egy rvidebb, a env programot hasznl megolds is, amivel egy futtathat szkriptfjl
elkezdhet o. Bash-szkript esetn pldul a #! /usr/bin/env bash sorral kezdve a szkriptet
biztosak lehetnk benne, hogy a bash program fogja vgrehajtani, brhol is legyen a $PATH-
on feltve, hogy van env program a /usr/bin-ben. (Ez pldul modern Linux, FreeBSD
s Solaris rendszerekre igaz is.) Ugyanez a trkk Make esetn #! /usr/bin/env make -f
shebang-sort eredmnyezne, ami nem m ukdne, mert a kernel az argumentumokat nem vgja
fel szkzk mentn, teht a make -f parancsot prbln elindtani, ahelyett, hogy a make
parancsot futtatn az -f kapcsolval. Htrny mg, hogy gmake-kel nem is prblkozik.
2.4. sed: stringm uveletek
A sedet az 1970-es vekben az igny hvta letre, hogy a shell nem knlt elg hatkony
eszkzket szvegfeldolgozsra. Ks obb ez a helyzet javult, m a mai shellekben is kifeje-
zetten knyelmetlen egy string belsejb ol adatot kinyerni. A Unix-lozt [17] kvetve nem
a shellt b ovtettk, hanem egy cleszkzt fejlesztettek ki.
Az sed ltalnos szvegfeldolgozsi modellje a kvetkez o. A sed-szkript egy szablylis-
ta. Minden szably egy felttelb ol s a felttel teljeslsekor vgrehajtand (esetleg sszetett)
utastsbl ll, melyek mdosthatjk az adott sort (s hasznlhatnak vltozkat, melyek r-
tke kt sor kzt megmarad). A sed a bemenett soronknt olvassa, minden sorra vgigmegy
a szablylistn, s az eredmnyl kapott sort kirja a kimenetre. Ugyanezt a modellt kveti
az AWK, tovbb a Perl, a Ruby s PHP is meghvhat olyan kapcsolkkal, hogy a kapott
szkriptet soronknt dolgozza fel.
A sedet shell-szkriptekb ol szoks hvni, a sed-szkriptet parancsargumentumban megadva.
Pldul az albbi Bourne shell-rszlet a MACI vltozban cserli az sszes barnamedvt s
jegesmedvt mosmedvre:
MACI="echo "$MACI" | sed s/\(barna\|jeges\)\(medve\)/mos\2/g"
Hasonl bonyolultsg parancsokkal lehet a shell-szkriptben fjlneveket talaktani, pl. a ki-
terjesztsket megvltoztatni.
A sed leghatkonyabb eszkze, a regulris kifejezs mind sz ursre (a felttelrszben),
mind cserre (az utastsrszben), mind csere utni feltteles elgaztatsra hasznlhat. To-
vbbi eszkzk: karaktercsere, string msolsa az aktulis sorbl az egyetlen vltozba s
vissza, elgaztats, sorszm-intervallumok megadsa a felttelben.
A sed korltai : nem lehet benne szmolni, az aktulis soron kvl csak egy vltozja
van, csak soronknt tudja a bemenetet feldolgozni, nem tmogatja a strukturlt programozst
(ciklus, fggvny), a szintaxisa nehezen olvashat. Shell-szkriptb ol hvva tovbbi htrny,
hogy lass, mert minden stringkezel o m uvelethez j sed folyamatot kell indtani.
Az ismert korltok ellenre a sed azrt van mg ma is hasznlatban, mert biztosan lehet
szmtani r, hogy minden Unixon fent van, s a szabvnyos utastsai ugyangy m ukdnek
benne mindenhol. gy teht a GNU AutoTools configure shell-szkriptje is sok helyen hasznl
sedet. Bonyolultabb szvegfeldolgozsi m uveletekre a minden Unixon jelen lev o eszkzk
kzl inkbb az AWK ajnlott (lsd a 2.5. szakaszban).
Br a sed nem tud szmolni, regulris kifejezseit vezrlsi szerkezeteivel kombinlva
rhat benne szmolgp (ami pldul a kisiskols mdon, szmjegyenknt ad ssze s szo-
Hatkony szkriptnyelvek Unixon 155
roz). Az elvi lehet osget illusztrland egy ilyen szmolgp kszlt 1996-ban, ami a dc
fordtott lengyel sorrend u, tetsz oleges pontossg szmolgpet emullja (teht a 2 + 3 4
kirtkelshez a 2 3 4
*
+p parancsot kell kldeni a bemenetre). A szmolgp forrskdja
megtallhat dc.sed nven a Debian sed csomagjban s itt [6] is.
Hordozhat sed shebang

A Make-nl felvetett problmt oldjuk meg sed esetn is:
hogyan lehet olyan szkriptet rni, amelynek els o shebang sorba nincs bedrtozva az interp-
reter elrsi tja. A megolds tja is a szoksos: a szkriptet #! /bin/sh shebang segts-
gvel shellben futtatjuk, s a szkript eleje arra utastja a shellt, hogy keresse meg, s indtsa
el az interterpretert az adott szkripttel. A szkript eleje nem csak shellben fut, hanem az adott
interpreterben is, s ott nem csinl semmit. A megolds sed esetn (Bourne s C shellekkel is
m ukdik) az albbi fejlc alkalmazsa:
#! /bin/sh
\false;true;eval (exit $?0)&&eval \
: f{bin;case c in esac;exec sed -n -f "$0" ${1+"$@"}; \
exec sed -n -f "$0" $argv:q
:in} # Dont touch lines 1--6: http://www.inf.bme.hu/~pts/Magic.sed.Header
A fejlc shell-szkriptknti rtelmezse nem okoz nehzsget. A sedes rtelmezs kicsit bo-
nyolultabb: \f-t ol f-ig egy regulris kifejezst lthatunk, utna a kapcsos zrjelek kzt a
bin utasts elugrik a:in-re (kihagyva a c. . . , e. . . s e. . . utastsokat, teht sszessgben
a fenti fejlc sedben semmit nem csinl s pp ez a feladata.
Az -n kapcsol azt eredmnyezi, hogy a (mdostott) sort tartalmt a sor feldolgozsa
utn a sed ne rja ki. Ezt a hatst elrhetjk -n nlkl is (vagyis akkor is, ha a szkript sed -f
prog.sed-knt van meghvva), ha egy d utastsbl ll sort helyeznk el a szkript vgre.
2.5. AWK: stringm uveletek strukturlt programban
Az AWK a sed sorfelttelutasts modelljt kvet o, klasszikus unixos szvegfeldolgoz
nyelv. Szintaxisa a C nyelvhez hasonl, s ennek megfelel oen kpes egsz s lebeg opontos
szmokkal szmolni, tartalmaz strukturlt vezrlsi szerkezeteket (if, while), kezel tmb-
ket, s lehet benne sajt fggvnyt denilni. Eltrs a C nyelvhez kpest, hogy a string be-
ptett tpus (a kapcsold memriakezelst az AWK-rtelmez o vgzi), az rtkeket egyms
mell rssal (vagyis az res opertorral) lehet konkatenlni, a tmbk asszociatvek (vagy-
is lehet pldul stringgel indexelni oket), a regulris kifejezs nyelvi elem (teht nem kell
duplzni a backslasheket), a sor vgn pontosvessz o nlkl is be lehet fejezni az utastst,
a fggvnydencnak ms a szintaxisa, s hogy a program nem csak fggvny- s egyb
dencikbl s deklarcikbl, hanem fggvnydencikbl s felttelutasts prokbl
ll. jdonsg a sedhez kpest, hogy a sorokat szkzk mentn mez okre bontja (s ezutn
zls szerint hivatkozhatunk az egsz sorra vagy annak mez oire), hogy mind a sorhatrt, mind
a mez ohatrt jelz o karakter tllthat, tovbb hogy kls o fjlokl s folyamatokbl rkez o
adatokat is tud fogadni (s rni is).
Linux rendszereken a mawk s gawk (GNU AWK) szabad implementcik elterjedtek, az
utbbi kicsit tbb funkcit tartalmaz, pldul TCP-kapcsolat nyitst.
Az AWK volt az els o szles krben elterjedt unixos szkriptnyelv, melyben hosszabb, tb-
bezer soros szvegfeldolgoz szkripteket is knyelmes volt rni, s az eredmnyl kapott
forrskd ltalban msok szmra is rthet o, tlthat lett. Ekzben az egysoros szkriptek
rsa is knyelmes maradt. Az AWK hatssal volt tbb modern szkriptnyelvre is.
Meggyelhet o, hogy egyes Unix-parancsok funkcii integrldtak a szkriptnyelvekbe.
Pldul a sed kpes kivltani a grepet, az AWK a cutot, s nmi programozssal a wc-t is.
A szmols megjelense az AWK-ban flslegess tette az expret. Ezek a funkcik modern
156 Szab Pter
szkriptnyelveinkben, kiss eltr o szintaxissal tovbb lnek.
Az AWK f o htrnyai : binris fjlokat nem tud kezelni (a nulls kd karakterrel s a fjl
vgn a soremels hinyval lehetnek gondok), a beptett fggvnyek kre nem b ovthet o
(pldul kls o programknyvtrak beemelsvel), valamint nagy szoftverek rshoz nem ad
kln tmogatst.
Az AWK, a sed, a bc, a dc is azon egyszer u unixos szkriptnyelvek egyike, melyek teljes
lersa egyetlen kziknyvoldalon elfr.
Hordozhat AWK shebang

A szoksos feltteleket teljest o fejlc, melyet a futtathat-
v tett szkript elejre kell rni, az albbi :
#! /bin/sh
false && 0>/dev\/null; true; \
eval (exit $?0)&&eval \
exec awk -f "$0" -- ${1+"$@"}; #\
exec awk -f "$0" -- $argv:q #/
# Dont touch lines 1--6: http://www.inf.bme.hu/~pts/Magic.AWK.Header
A shell-szkriptknt trtn o rtelmezs annyi jdonsgot tartogat, hogy a true-ra azrt volt
szksg, hogy a $?0 Bourne shellben 00-t adjon vissza (s ne 10-t). A fejlcet AWK-szkript-
knt ilyen: vltoznv && 0>/regexp/, ami mindenkppen hamis, mert egy /regexp/
mintailleszts eredmnye sosem negatv teht a fejlc AWK-ban az elvrsoknak megfele-
l oen m ukdik: nem csinl semmit.
3. Mai nyelvek
A trgyalt mai nyelvek kzs jellemz oi :
tanultak el odjeik s kortrsaik hibibl, s igyekszenek jobb megoldst adni ;
hatkony stringkezelst biztostanak regulris kifejezsekkel ;
lehet osg van bennk objektumorientltan programozni ;
aktv fejleszts alatt llnak, az j verzikban nyelvi jtsok is vrhatk;
Unixra egyetlen implementcijuk terjedt, s sok esetben azt tekintik az adott nyelven
helyes programnak, amit a referencia-implementci elfogad (egyes nyelveknek van
mg Java JVM-es vagy .NET-es impelentcija is) ;
Windowsra s ms rendszerekre is van implementcijuk, ezek ltalban a Uniximple-
mentci portjai ;
C nyelven b ovthet oek (s ezltal illeszthet ok hozzjuk C API-j u programknyvtrak) ;
lehet ov teszik nagy szoftverek fejlesztst, s a Lua kivtelvel klnbz o segd-
eszkzkkel (pl. teszt-keretrendszer, dokumentcigenerl, debugger) tmogatjk is;
a Lua kivtelvel, a megfelel o kiegszt okkel tmogatjk mind a szveges, mind a gra-
kus (Gtk, Qt vagy sajt), mind a webes alkalmazsok rst ;
lehet osget biztostanak webalkalmazs rsra, s az alkalmazs perzisztens futtatsra
(pldul a webszerverrel CGI helyett FastCGI protokollon kommuniklva) ;
a Lua, a Ruby s a PHP kivtelvel fejlett Unicode-tmogatst nyjtanak;
Hatkony szkriptnyelvek Unixon 157
dinamikus ktst hasznlnak, s a Pike kivtelvel nem ellen orzik a vltozk tpust ;
ves vagy nagyobb gyakorisggal az adott nyelvvel foglalkoz nemzetkzi konferenci-
kon mutatjk be a legjabb fejlesztseket.
A mai szkriptnyelvek kztt konvergencia gyelhet o meg: br a nyelvek szintaxisa s
lozja kzt sok a klnbsg, az adat- s vezrlsi szerkezetek, a beptett s kiegszt o
programknyvtrak kzt nagy az tfeds. A msodik s a harmadik szkriptnyelv elsajttsa
mr jval knnyebb az els onl.
3.1. PHP: knnyen elsajtthat webprogramozs
A PHP eredeti clja az volt, hogy a weboldalak egy rsze a szerveren, dinamikusan gener-
ldhasson, s ezzel a felhasznlk l obb tehessk a honlapjaikat. A nyelv s az implemen-
tci is sokat fejl odtt az els o elterjedt verzi, a PHP/FI ta. A PHP5 egy objektumorientlt
programozst is lehet o tv o, tbb webszerverrel s tbb protokollon keresztl is m ukdni
kpes, szles krben npszer u, knnyen elsajtthat, sok kiegszt o modullal (pl. adatb-
zis-illeszt ok) rendelkez o, AJAX-os fejlesztsre is alkalmas szkriptnyelv. Npszer usgt jelzi,
hogy tbb webszolgltat (kztk ingyenesek is) lehet ov teszi PHP-szkriptek futtatst a
szerveren.
A PHP rendkvl knnyen tanulhat, azonnal hasznlatba vehet o, a bonyolultabb szol-
gltatsait elg csak akkor megismerni, amikor szksg van r. A PHP-r ol szl knyvekb ol
Dunt lehet rekeszteni (magyar fordtsban is tbb tucat jelent meg), csakgy, mint a webes
tutorialokbl. Rendkvl hasznosak a PHP honlapjn lev o, fggvnyekre lebontott referen-
cialershoz f uztt felhasznli megjegyzsek, ahol j esllyel megtallhat a megolds, ha
egy adott fggvny nem gy m ukdik, ahogy szeretnnk (vagy ppen nem a megfelel o fgg-
vnnyel prblkozunk).
A PHP-s webfejlesztst szmos eszkz tmogatja, kztk pldul az Eclipse szabad IDE
s a Zend Studio zet os IDE, de vannak egyb eszkzk, pl. dokumentci-generlk is.
A PHP szintaxisa a C nyelvhez hasonl, azzal a klnbsggel, hogy a vltoznevek el ott
dollrjelet kell hasznlni, a vltozkat nem lehet deklarlni (s a fggvnyargumentumok t-
pust sem kell megadni). A kdot <?php s?> kz kell tenni (include-olt fjlok esetn is),
az ezeken kvli szvegrszeket a PHP vltozatlanul a kimenetre msolja. A kimenet web-
alkalmazs esetn a bngsz onek kldtt oldal, parancssori futtatsnl pedig a szabvnyos
kimenet.
A PHP alapbl minden HTTP-krskor jra betlti s rtelmezi a krst kiszolgl kdot
s a kd ltal hasznlt, PHP nyelv u programknyvtrakat is. Az emiatt bekvetkez o lassuls
n. source cache segtsgvel megel ozhet o. Szabad source cache pldul az APC, s tbb ke-
reskedelmi implementci is van. Olyan szoftverek is letlthet ok, melyek a szkript vgrehaj-
tst gyorstjk (a bjtkd optimalizlsval vagy eltr o futtatsi stratgia alkalmazsval).
A PHP-t szmos htrnya akadlyozza abban, hogy webes felleten kiszortsa az egyb
szkriptnyelveket (gondolunk itt f oleg a Perlre; Rubyra s a Pythonra). Egyes htrnyok a
nyelvi termszet uek (pl. nincs closure a nyelvben; a loklis vltozk helyett a globlisakat
kell kln deklarlni ; fggvny ltal visszaadott tmbt nem lehet kzvetlenl indexelni ; a
string- s tmbkezel o m uveletek nem fogalmazhatk meg olyan tmren; mint ms nyelvek-
ben; kln odagyelst ignyel, hogy egy argumentumot referencia vagy rtk szerint adunk
t egy fggvnynek; nincs megfelel o Unicode-tmogats stb.), msok pedig a beptett fgg-
vnyek s a kommunikcis interfsz hinyossgai (pl. tl sok a beptett fggvny; kevs
a beptett osztly; a fggvnyek elnevezse s paramtersorrendje nem konzisztens, ezrt
nehezen megjegyezhet o; a hiba esetn visszaadott rtk nem konzisztens; nincs jl tgon-
dolt, hivatalos t kivtelkezelsre s adatbzis-kezelsre; nem lehet minden kivtelt elkapni
(pl. ha nem ltez o fggvnyt hvunk, akkor a hibazenetet mindenkppen megkapja weboldal
158 Szab Pter
ltogatja) ; nagy fjlok feltltshez tl sok memrit ( !) hasznl ; a feltlts folyamata nem
szkriptelhet o; a komponensek nem kombinlhatk szabadon, pldul FTP-r ol rszlegesen
letlttt fjlt nem lehet kzvetlenl a kimenetre rni). A fentiek miatt egyes, ms szkript-
nyelvekhez szokott fejleszt oknek kifejezetten knyelmetlen PHP-ben dolgozniuk, mert fo-
lyamatosan azt rzik, hogy az adott feladatot a sajt, kedvenc nyelvkn sokkal gyorsabban,
javtgatsok s idegeskeds nlkl megoldank.
A htrnyok nagy rsze abbl addik, hogy a mai PHP egy hossz, szerves fejl ods ered-
mnye, s a fejleszt ok az j szolgltatsokat legtbbszr csak hozzraktk a meglv oekhez,
s ahol csak lehet, nem vltoztattak, hogy a rgi PHP-szkriptek tovbbra is m ukdjenek.
Emiatt a mai PHP nem pont a mai ignyeket szolglja ki.
3.2. Perl: svjcibicska minden rendszeren
A Perl egy ltalnos cl, hatkony szkriptnyelv. Eredetileg szvegfeldolgozsra kszlt,
pontosabban szvegfjlokbl informci-kinyersre s jelentsek generlsra. Azta kieg-
szlt a rendszerhvsok s a Unixokon elrhet o programknyvtrak hasznlatnak lehet os-
gvel, s szmos modul szletett, amely ezeket knyelmess s hatkonny teszi. Megalapo-
zott vlt a monds, hogy Perlben mindent meg lehet csinlni, s ot a Perl jelmondata szerint
tbbflekppen is meg lehet csinlni. Ez nem is meglep o, hisz a Perl kitallja nyelvsz,
s az emberi beszdhez hasonl programnyelvet kvnt alkotni, s a beszd jellemz oje, hogy
ugyanazt a gondolatot sokflekppen ki lehet fejezni, mindenki az izlse s a kpessgei
szerint formlja beszdt.
A Perl szintaxisa csak tvolrl hasonlt a C nyelvre. A C-hez kpest jdonsg, hogy a
vltozneveket a vltoz tpustl fgg oen $, @ vagy % jellel kell kezdeni, a vltozk tpu-
st nem lehet deklarlni, a vltozkat nem kell deklarlni (de ajnlott), a fggvnydenci
szintaxisa ms, vannak regulris kifejezsek, s stringen bell is van vltoz-behelyettests.
A Perlr ol egy rvid, magyar nyelv u bevezet o lers olvashat [18]-ban. A Perlt sokan kritizl-
jk amiatt, hogy nehezen olvashat a kd. A nehz olvashatsgnak rszben az az oka, hogy
tl sok nyelvi elem knlkozik, melyek nagy rsze rsjelekb ol ll, gy egsz hossz kd-
rszletek is keletkezhetnek, melyben bet ut csak elvtve tallni. Jobban olvashat, a Perlhez
hasonl tuds szkriptnyelv a Ruby, s nagyon jl olvashat szkriptnyelv a Python.
Egyes Perl-programozk rdekessgkppen kzztesznek szndkosan elbonyoltott, rt-
hetetlenre rt, rvid programkdokat [16]. Az albbi kd [11] pldul
not exp log srand xor s qq qx xor
s x x length uc ord and print chr
ord for qw q join use sub tied qx
xor eval xor print qq q q xor int
eval lc q m cos and print chr ord
for qw y abs ne open tied hex exp
ref y m xor scalar srand print qq
q q xor int eval lc qq y sqrt cos
and print chr ord for qw x printf
each return local x y or print qq
s s and eval q s undef or oct xor
time xor ref print chr int ord lc
foreach qw y hex alarm chdir kill
exec return y s gt sin sort split
csak Perl kulcsszavakbl ll s ezek a kulcsszavak egytt (rsjelek nlkl) egy m ukd o
Perl-programot alkotnak, amely kir egy rvid zenetet. Mg szerencse, hogy tbbflekp-
pen is meg lehet csinlni, s a nagy perles projektek nem az elbonyoltott utat vlasztjk.
Taln a Perl a legtbb opercis rendszeren hasznlhat szkriptnyelv. F o implementci-
Hatkony szkriptnyelvek Unixon 159
jt, a Perl 5-t tbb tucat Unix s szmos nem Unix rendszerre portoltk, a legtbb Linux-
disztribci alaprtelmezsben feltelepti. A Perl 6 megjelense lassan egy vtizede hzdik,
de az el ozetes lersok s flksz implementcik azt mutatjk, hogy a Perl 5-t ol lnyegesen
klnbz o, teljesen tdolgozott nyelvre s implementcira szmthatunk, Perl 5-s szkripte-
ket futtatni tud, kompatibilitsi mddal.
A Perlt sokfle clra hasznljk: egysoros szkriptekkel megoldhat feladatokra (a sed
s az AWK nyomdokain), szvegfeldolgozsra, binris fjlok feldolgozsra, rendszeradmi-
nisztrcis m uveletekre, egyszer ubb grakus felletekhez (pl. grakus Linux-telept o), web-
alkalmazsokban, IRC-kliens szkriptelsre (pl. Irssi), szvegszerkeszt o szkriptelsre (pl.
Vim).
A Perlben rt, jgenercis, modellnzetvezrl o alap webalkalmazs-keretrendszerek
kzl a Catalystet s a Maypole-t kell megemltennk. Ezen keretrendszerek olyan modellt,
programknyvtrakat s futtatkrnyezetet biztostanak, melyek jobb kdot eredmnyez o s
hatkonyabb webalkalmazs-fejlesztst tesznek lehet ov, mint a korbban megszokott md-
szer (elkezdem rni a CGI-szkriptet, s folyamatosan b ovtem minden funkcival, ami csak
kell). Az emltett keretrendszerek clkit uzsben s tudsban a Ruby on Railshez hasonlk.
A Perl annak idejn regulris kifejezseivel de facto szabvnyt teremtett. Ks obb megsz-
letett a PCRE, ami a Perl-kompatibilis regulris kifejezsek Perlt ol fggetlen megvalstsa
egy programknyvtrban. Hasznlja a PHP, az Apache, a Potsx s az Nmap is. A regulris
kifejezssekkel trtn o szvegfeldolgozs hatkonysga azonban nemcsak a regulris kife-
jezsek szintaxistl, hanem azoknak a programozsi nyelvbe val integrlstl is fgg. A
PCRE csak az el obbit veszi t a Perlt ol, az integrls szoftverenknt ms s ms. (A tovbbi
megjegyzsek nem a PCRE-re vonatkoznak.) AWK, Perl s Ruby esetn pldul a regul-
ris kifejezsek a nyelv rszei, s van beptett illeszts, csere s feldarabols m uvelet. PHP,
Python, Lua, Pike s Java esetn viszont az integrci nem teljes, ezrt minden regexp-m u-
velet knyelmetlen, nehzkes, s flslegesen bonyoltja a kdot ezekben a nyelvekben pl. a
Perlhez kpest.
Minden fejleszt o szmra nyitott a lehet osg, hogy az ltala ksztett Perl-modulokat az
egsz kzssg szmra szabadon elrhet ov tegye. Ehhez biztost infrastruktrt a CPAN
[5], ahol a legtbben publikljk a sajt fejleszts u moduljaikat. Az olyan nagy projektek
legfrissebb kiadott verzii, mint maga a Perl 5, a Perl 6, a Catalyst s a Maypole is a CPAN-
r ol rhet ok el. A CPAN a Perl-modulok kifogyhatatlan trhza. Egyik f o szolgltatsa, hogy
webes felletn kereshetnk a Perl s a Perl-modulok dokumentcijban, a Perl-modulok
metaadataiban (pl. modulnv, szerz o, disztribci). A megtallt modul forrskdjt a weben
le is lehet tlteni, m erre inkbb a CPAN shell ajnlott, amely a Perl teleptsekor felkerl
a rendszerre, s a CPAN-r ol tudja magt s ms modulokat is frissteni. Rszletes magyar
nyelv u lers a CPAN-r ol [13]-on.
Szkriptek perzisztens futtatsra hasznlhat a Perl-specikus SpeedyCGI s az ltalnos
FastCGI protokoll is.
A Perlt a rosszul megrt forrskd nehezen olvashatsga mellett kritika szokta rni
azrt, mert nem knl egy egysges utat az objektumorientlt programozsra, tovbb, hogy
a memriafelszabadts nem szemtgy ujtsen, hanem referenciaszmllson alapul. Ezeket a
htrnyokat a Perl 6 javtani fogja.
Hordozhat Perl shebang

#! /bin/sh
eval (exit $?0) && eval PERL
_
BADLANG=x;PATH="$PATH:.";export PERL
_
BADLANG\
PATH;exec perl -x -S -- "$0" ${1+"$@"};#if 0;eval setenv PERL
_
BADLANG x\
;setenv PATH "$PATH":.;exec perl -x -S -- "$0" $argv:q;#.q
#!perl -w
+push@INC,.;$0=~/(.
*
)/s;do(index($1,"/")<0?"./$1":$1);die$@if$@
__
END
__
+if 0
160 Szab Pter
;#Dont touch/remove lines 1--7: http://www.inf.bme.hu/~pts/Magic.Perl.Header
Ez a megolds kicsit hosszabb a megszokottnl. Rszletes magyarzata angol nyelven [12]-
ben olvashat. A PERL
_
BADLANG=x rtkadsra azrt volt szksg, hogy a Perl ne mutasson
gyelmeztet o zenetet, ha a locale bellts hibs a rendszeren. A Perl, ha az els o, shebang
sorban nem ltja a perl stringet (mint esetnkben), akkor a programot a shebang sorban ltott
parancsnak adja t. Ez esetnkben nem j, mert vgtelen ciklust kapnnk (a shell meghvja a
Perlt, ami visszahvja a shellt stb.). A vgtelen ciklust gy kerli el a megoldst, hogy a Perlt
a -x kapcsolval hvja, melynek hatsra a Perl a #!perl-es sortl kezdve kezdi rtelmezni
a szkriptet. Ekkor viszont a hibazenetben elromlanak az oldalszmok, ennek orvoslsra a
kvetkez o sorban a szkript do-val betlti s futtatja nmagt (majd
__
END
__
-del kilp, hogy
ne fusson ktszer). Amikor viszont ellr ol kezdi futtatni a szkriptet, akkor a do-t tartalmaz
sort vgre se hajtja, mert azt el van rejtve egy q+...+ if 0; utastsban.
A fentieket gyelembe vve a fenti fejlc ngy klnbz o mdon kpes futni (s mind-
egyik mdnak van haszna) : Bourne shell-szkriptknt, C shell-szkriptknt, Perl-szkriptknt
ellr ol s Perl-szkriptknt a #!perl sortl.
Hordozhat SpeedyCGI shebang

#! /bin/sh
eval (exit $?0)||eval setenv PERL
_
BADLANG x;set S="-w";>/dev/null\\
which speedy&&exec speedy $S "$0" $argv:q;exec perl $S -eshift=~/\(.\
*
\)/"\\
;do(("\$0=\$1")=~m,^.?.?/,?"\$0:qq,./\$0,\)\;die\$@if\$@ "$0" $argv:q#if 0;
eval export PERL
_
BADLANG=x;type -p speedy>/dev/null&&exec speedy -w \
"$0" ${1+"$@"};exec perl -w -e"shift=~/(.
*
)/;do((\$0=\$1)=~m,^.?.?/,?\$0
:qq(./\$0));die\$@if\$@" "$0" ${1+"$@"};:if 0;BEGIN{delete$INC{+
__
FILE
__
};q
#! perl -w
+$0=~/(.
*
)/;do(($0=$1)=~m,^.?.?/,?$0:qq(./$0));die$@if$@;
__
END
__
+}
#"# Dont touch lines 1--10: http://www.inf.bme.hu/~pts/Magic.Speedy.Header
Lnyegesen j tletet nem tartalmaz a Perl shebanghez kpest. A f o klnbsg az, hogy a
szkriptet el oszr a speedy programmal prblja futtatni, s ha ez nem sikerl (pldul azrt,
mert a SpeedyCGI nincs teleptve), akkor a sima perl-t hasznlja. Sajnos a Bourne s C
shellek annyira klnbznek, hogy ugyanazt a funkcit kln-kln kellett bennk megval-
stani.
3.3. Python: jl olvashat, objektumorientlt szkriptek
APython egy ltalnos cl, objektumorientlt szkriptnyelv, amely f oleg nyelvi tisztasgval,
egyszer usgvel t unik ki a modern szkriptnyelvek kzl. Emiatt els o nyelvknt oktatsra is
kivlan alkalmas. A f o eltrs a tbbi szkriptnyelv szintaxishoz kpest, hogy a program
struktrjt nem kapcsos zrjelekkel, hanem beljebb kezdssel jelzi. Pldul 1-t ol 10-ig a
szmokat az albbi programmal lehet kirni :
i=1
while i<=10:
print i
i=i+1
print "Vge"
Tovbbi fontos klnbsg, hogy rtkads nem szerepelhet utasts kzepn. Ez is hozzjrul
a j olvashatsghoz, mert emiatt nem lehet a fenti ciklust egyetlen sorba sszevonni, mint
pldul Perl esetn: $I=0; while ($++I<=10) { print "$I\n" }.
A legismertebb Python-alkalmazsok a Zope webes tartalomkezel o, a Zorp magyar fej-
leszts u, az alkalmazsi rtegben m ukd o t uzfal, a Gentoo Linux Portage nev u csomagkeze-
Hatkony szkriptnyelvek Unixon 161
l oje s a Trac webes projektmenedzsment eszkz (SVN-vizualizcival, hibajegykezel ovel s
wikivel). Egyes szoftverek, pldul a XEN, kongurcis fjljait Pythonban kell elkszteni.
Hordozhat Python shebang

#! /bin/sh
"""true"; eval (exit $?0)&&eval \
exec python -- "$0" ${1+"$@"}
exec python -- "$0" $argv:q #"""
# Dont touch lines 1--5: http://www.inf.bme.hu/~pts/Magic.Python.Header
Az alaptlet az, hogy Pythonban a tbbsoros stringkonstansokat hromidz ojel hatrolja, mg
a shell-szkriptben a kt nyit idz ojelnek semmi hatsa, a harmadik zrprja pedig rgtn a
true sz utn tallhat. A Python gyelmen kvl hagyja az nmagban ll stringkonstan-
sokat, teht a fejlc a Pythonban nem csinl semmit.
Megjegyezzk, hogy a C shell egy parancsot kls o programknt futtat, ha a parancs neve
idz ojelet vagy backslasht tartalmaz. Teht a fenti """true" C shellben a /bin/true-t fogja
futtatni, Bourne shellben pedig a shell bels o true parancst. Hatsuk ugyanaz.
3.4. Ruby: a programozk kedvence
A Ruby is egy j, objektumorientlt, ltalnos cl szkriptnyelv, amely igyekszik tvzni
ms szkriptnyelvek j tulajdonsgait. Szintaxisra hatssal volt a Python tisztasga (de nem
rzkeny a beljebb kezdsre: a blokk vgnek jelzsre az end kulcssz hasznlatos), s
ugyaninnen vette a stringek s a listk intervallummal trtn o indexelst is. A Smalltalktl
vette t azt az elvet, hogy minden rtk objektum, mg a szmok is (ett ol mg nem pazarolja
a memrit szmok trolsakor), a Perlt ol s az AWK-tl rklte a regulris kifejezsek
nyelvbe jl integrlt kezelst.
Aj olvashatsg rdekben a konstansokat (belertve az osztlyok neveit is) nagybet uvel
kell kezdeni, a loklis vltozkt kisbet uvel (s kln jele van a globlis vltozknak s a
pldnyvltozknak). Ez kdolskor nem jelent nagy terhet, viszont msok kdjt sokkal
gyorsabban olvashatv s rthet ov teszi.
Nyelvi jdonsg Rubyban az itertor fogalma. A Ruby-beli itertor egy knyelmes szin-
taxis closure, vagyis olyan utastsblokk, amely a krnyezetnek loklis vltozit hasznlja,
de nem a krnyezetb ol kerl meghvsra. Pldul az albbi Ruby-szkript az argumentumait
adja ssze egsz szmknt :
sum = 0
ARGV.each { |arg| sum += arg.to
_
i }
p sum
A program kapcsos zrjelbe tett rsze az itertor : ez egy olyan kdrszlet, ami nem kzvet-
lenl kerl meghvsra, hanem az each metdus hvja az ARGV tmb minden elemre egyszer.
Az itertor nem forradalmian j tlet ; a Ruby jtsa abban ll, hogy knyelmes szintaxist
biztost r, s el oszeretettel hasznlja standard programknyvtrban.
Egyedi megolds a Rubyban, hogy felttelben csak a false s a nil rtk szmt hamis-
nak, s pldul a 0 s a 0.0 s az res string is igaz. A Ruby alkotja nem vletlenl dnttt
gy: ezltal tmr s kifejez o kd rhat az albbihoz hasonl feladatokra: ha a kp szles-
sge nem ismert, akkor prbld meg GIF fjlknt betlteni, s kinyerni a szlessget, s ha
ez nem sikerl, akkor prbld meg JPEG fjlknt betlteni, s kinyerni a szlessget. A kd
a kvetkez o:
width ||= get
_
gif
_
width(image) || get
_
jpeg
_
width(image)
162 Szab Pter
A megolds akkor m ukdik, ha a hvott fggvnyek nil-t adnak vissza, ha nem ismerik a
formtumot, s egy szlessget jell o szmot (akr 0-t is!), ha ismerik. Hasonlan tmr
megoldst nem lehet adni olyan nyelvekben, melyek a nullt hamisnak tekintik.
Rubyban bizonyos fggvnyeknek tbb nevk van. Pldul nem kell emlkeznnk, hogy
egy string hosszt length vagy a size metdus adja-e vissza: brmelyiket hasznlhatjuk.
A Ruby tletesen nevezi el a getter/setter metdusokat. Pldul az img.width=42 rtk-
ads az img objektum width= metdust, a img.width lekrdezs pedig a width metdust
hvja. Ezltal a Ruby megel ozi, hogy a kd tele legyen get-tel s set-tel.
Az osztlyokhoz brmikor felvehet o j metdus. Ez az alaposztlyokra is igaz, gy pldul
az egsz szmokra s a stringekre alkalmazott metdusok krt is brmikor b ovthetjk.
A fentihez hasonl apr tletek egyttese eredmnyezi, hogy Rubyban keveset kell g-
pelni, nem kell flsleges dolgokon gondolkozni, s jl olvashat a kd.
A Ruby nyelv a Ruby on Rails nev u, modellnzetvezrl o alap webalkalmazs-keret-
rendszer megjelensvel s elterjedsvel kerlt be a kztudatba. A Railsszel egyszer u s
knyelmes az adatbzis alap webes alkalmazsok fejlesztse. A Rails egy olyan modellt de-
nil, melyben nagy webalkalmazsok prhuzamos fejlesztse is lehet ov vlik a kd tlzott
elbonyoldsa nlkl. A [2] cikkben rvid magyar lers olvashat a Railsr ol. A Rails hamar
a programozk kedvencv vlt, s hatssal volt ms programnyelvek webalkalmazs-keret-
rendszernek fejl odsre is (pldul hasonl perles keretrendszer a Catalyst). A Rails aktv
fejleszts alatt ll.
A Ruby sajt szlkezelssel rendelkezik, amit sajnos nem elg stabil, gyakran beragadnak
a tbbszl szkriptek.
A Ruby nem csak webfejlesztskor remekel, hanem szvegfeldolgozsra, hlzati prog-
ramozsra (pl. msolgats tbb TCP/IP kapcsolat mgtt), XML-feldolgozsra is kivl, s ot :
Tk- s GTK-ktse segtsgvel grakus alkalmazsok is fejleszthet ok. Idelis tovbb gyors
prototpusksztsre. Tiszta objektumorientlt szemllete miatt programozsi nyelvek tanul-
sakor els o objektumorientlt nyelvnek is j.
Hordozhat Ruby shebang

#! /bin/sh
eval (exit $?0)#+/&&eval #/ if 1<1&&\
PATH="$PATH:."; exec ruby -x -S -- "$0" ${1+"$@"}
setenv PATH "$PATH":.;exec ruby -x -S -- "$0" $argv:q
#!ruby -w
##Dont touch/remove lines 1--6: http://www.inf.bme.hu/~pts/Magic.Ruby.Header
A shell s a Ruby sztvlasztsa az eval-lal kezd od o sorban trtnik. Ezt a sort a shell gy lt-
ja: eval (exit $?0)# && eval #\, a Ruby pedig gy: eval string + /regexp/
if 1<1&&parancs. A parancsot zr az utols sorban fejez odik be. A Ruby a vrehajtst
az 1<1 felttelrsz kirtkelsvel kezdi, ami hamis, teht nem rtkeli ki se a parancs-ot
(ami kls o program futtatst eredmnyezn), se a string-et, se a /regexp/-et. Elrtk
teht a kvnt hatst : a fejlc Rubyban semmit nem csinl.
3.5. Pike: webprogramozs C-szer u szintaxissal
Az LPC a MUD-ok
2
egy nagy rsznek (az LPMud-oknak) objektumorientlt szkriptnyel-
ve volt, vagyis LPC nyelven alaktottk ki a fejleszt ok a MUD vilgt : a helyszneket, az
ellensgeket (s a bartsgos lnyeket, pldul keresked oket), a felszerelsi trgyakat s a
harcrendszert is. A jtk logikja is LPC nyelven volt leprogramozva: a rendszer milyen pa-
2
az 1990-es vek elejnek telneten jtszhat szveges szerepjtkai, ahol a f o cl az egyre er osebb ellensgeket
legy ozse egyre jobb kpessgekkel s fegyverekkel, esetleg a tbbi jtkos segtsgvel
Hatkony szkriptnyelvek Unixon 163
rancsokra hogy reagl, egy pncl milyen hatssal van visel oje harcrtkre, mikor s milyen
mrtkben fejl odnek a jtkos kpessgei stb. Egy vilgot ltalban sokan fejlesztettek: nem
volt ritka, hogy a jtkot indt 35 f os csapat mell ks obb akr tucatnyian csatlakoztak,
akik ltalban kevesebb jogosultsggal rendelkeztek: csak egy-egy kldets vagy vilgrsz
kidolgozsa volt a feladatuk, a jtk logikjt nem mdosthattk. LPC-ben az egyes ob-
jektumokat (pl. jtkosok) ki lehetett menteni, hogy a jtk jraindtsakor tulajdonsgaik
meg orz odjenek.
Manapsg a MUD-okat mr kiszortottk a 3D-s szerepjtkok, s ezltal az LPC nyelv
is vesztett jelent osgb ol. A vltozs nem rintette azonban a Pike-ot, amely az LPC ltal
ihletett, de azta tovbbfejlesztett, nllan (nem MUD-on bell) hasznlatos, ltalnos cl,
objektumorientlt szkriptnyelv. Els o s legfontosabb ipari alkalmazsa Roxen Challenger
webszerver volt, amely C-ben s Pike-ban vegyesen volt rva, s mind a szkriptelst, mind
a webalkalmazsok fejlesztst tmogatta Pike-ban. A programrl Caudium nven szabad
szoftver projekt gazott le, s a mai napig ez az egyik legnagyobb Pike-ra pl o projekt.
A Pike szintaxisa az LPC-n keresztl a C nyelvb ol szrmazik, s meg orizte azt, hogy
a vltozkat tpussal deklarlni kell, tovbb gy ujtemnyek (pl. tmb, asszociatv tmb) az
elemek tpust is meg kell adni. Lehetsges viszont tpusmegkts nlkli vltozt (mixed) is
deklarlni. Pike-ban, hasonlan a szkriptnyelvek tbbsghez, van string tpus, automatikus
a memriakezels, s az sszetett tpusok referencia szerint kerlnek tadsra.
Hordozhat Pike shebang

#! /bin/sh
#if 0
eval (exit $?0)&&eval \
exec pike -- "$0" ${1+"$@"}
exec pike -- "$0" $argv:q
#endif // Dont touch lines 1--6: http://www.inf.bme.hu/~pts/Magic.Pike.Header
Afejlc azt hasznlja ki, hogy a Pike rendelkezik preprocesszorral, gy az #if 0 s az #endif
kzti sorokat gyelmen kvl hagyja. Ugyanezzel a trkk pldul C nyelven is bevethet o, te-
ht lehet olyan C forrsfjlt rni, ami shell-szkriptknt futtatva lefordtja nmagt a megfelel o
belltsokkal.
3.6. TCL: grakus felleteket gyorsan
A TCL nyelv szorosan kt odik a vele egytt fejlesztett Tk grakus eszkzkszlethez. A Tk
volt az 1990-es vek kzepn az egyik els o knnyen szkriptelhet o eszkzkszlet (angolul to-
olkit) X11 grakus felletre. Ks obb kiadtk a TCL/Tk-t Windowsra s Mac OS X-re is, ezzel
lehet ov vlt a tmogatott rendszerek kztt hordozhat (m nem teljesen azonos kinzet u)
grakus ablakoz alkalmazsok rsa. A TCL/Tk az els o szkriptnyelvek egyike volt, melyek
a Unicode-tmogatst nyjtottak nem csak stringekben, hanem regulris kifejezsekben s a
grakus vezrl oelemeken is. Az esemnyvezrelten programozhat Tk grakus eszkzksz-
letet kiegsztettk szintn esemnyvezrelt socketkezelssel, ezltal lehet ov vlt TCP/IP
kliensek s szerverek rsa TCL-ben. A fenti el onyk miatt a TCL/Tk npszer uv vlt gyors
prototpus ksztsre, f oleg grakus felletek esetn.
A TCL nyelv egyedi szintaxissal rendelkezik, ami (a LISP-hez hasonlan) zrjelezsen
alapul, s az opertorok s a vezrlsi szerkezetek teljesen hinyoznak bel ole, pontosabban:
ezen szolgltatsoknak nincsen szintaktikus megfelel oje. A TCL-program utastsokbl ll,
melyeket soremels vagy pontosvessz o vlaszt el egymstl. Minden utasts egy szkzk-
kel elvlasztott lista, melynek els o eleme a parancs neve, a tovbbi elemek pedig az argumen-
tumok. Ha kapcsos zrjelbe tesznk egy listaelemet, akkor egyben marad, nem bontdik fel
164 Szab Pter
szkzk mentn. Ha szgletes zrjelbe tesszk, akkor TCL-utastsknt lefut, s az ltala
visszaadott string kerl behelyettestsre. A szintaxisban szerepel mg dollrjel utn vltoz-
behelyettests s stringkpzs idz ojellel. A TCL f o adatstruktrja a string ha egy a lista
stringknt van megadva, akkor ugyangy bontand elemeire, mint egy utasts. Pldul az
albbi utasts
puts [lindex {a {b {c d} e} f} 1]
hatsra el oszr a ktargumentum lindex parancs fut le, ami az els o argumentumban ka-
pott a {b {c d} e} f listnak vlasztja ki az els o elemt, s mivel a TCL a listaelemeket
nulltl szmozza, az els o elem a b {c d} e string lesz (ami rtelmezhet o listaknt is, ha
listakezel o parancsnak adjuk), de jelen esetben a puts parancs kapja meg, ami soremelssel
lezrva kirja a kperny ore. (A fenti utasts berhat tclsh program indtsa utn.) Vegyk
szre, hogy mind az utastsvgrehajts, mind az lindex eltntetett egy kapcsoszrjel-prt.
Plda ciklusszervezsre:
set i 1; while {$i<=10} {puts $i; incr i}
A fenti programrszlet 1-t ol 10-ig rja ki a szmokat. Lthatjuk, hogy a TCL a stringeket tbb
clra is felhasznlja: szmok s listk is megadhatk s felhasznlhatk stringknt, tovbb
aritmetikai kifejezst (pl. $i<=10) s a kdrszletet is (pl. puts $i; incr i) is stringknt
kell tadni.
A TCL szintaxisa volt az egyik f o akadlya annak, hogy a nyelv ltalnos cl szkript-
nyelvknt elterjedjen. Gyakori, hogy a TCL-programoz nem tud a feladat megoldsra kon-
centrlni, mert a kapcsos s szgletes zrjelek pontos elhelyezsre kell gyelnie, melyek
gyakran 5 vagy mg nagyobb mlysgben, nehezen kvethet oen gyazdnak egymsba
ms szkriptnyelvekben ugyanazt a feladatot zrjel nlkl, sokkal gyorsabban meg lehetett
volna oldani, s az eredmny is tmrebb s rthet obb lenne.
A TCL alaprtelmezsben nem objektumorientlt, de [incr Tcl] nven van hozz ilyen
kiegszt o.
A Tk grakus eszkzkszlet szorosan kt odik a TCL-hez. A Perl/Tk s Ruby/Tk prost-
sok is hasznlnak TCL-t a belsejkben, de ezt, amennyire csak lehet, elrejtik, s az esemny-
kezel ok megrst Perl illetve Ruby nyelven szorgalmazzk. A GTK s Qt eszkzkszletek
megjelensvel a Tk visszaszorult : a kt j eszkzkszlet nem csak szebb s intuitvabb a mai
felhasznl szmra, hanem jval tbb beptett vezrl oelemet tartalmaz, s egyedi vezrl o-
elemek rsa sem tl bonyolult. A modern szkriptnyelvekhez van GTK- vagy Qt-illeszts.
Anemgrakus felhasznlsra plda az egyik legnpszer ubb IRC-bot, az Eggdrop, amely
TCL-ben szkriptelhet o.
Hordozhat TCL shebang

#! /bin/sh
# Dont touch lines 1--5: http://www.inf.bme.hu/~pts/Magic.TCL.Header \
eval (exit $?0)&&eval \
exec tclsh "$0" ${1+"$@"}; #\
exec tclsh "$0" $argv:q
Az alkalmazott alaptrkk ismer os: a sztvlaszts azt hasznlja ki, hogy TCL-ben a meg-
jegyzs a sor vgre tett backslashsel a kvetkez o sorban folytatdik, mg shellben nem. Ha
TCL/Tk grakus alkalmazsainkhoz szeretnnk hasonl fejlcet, akkor a fentiben a tclsh-t
cserljk wish -f-re.
Hatkony szkriptnyelvek Unixon 165
3.7. Lua: letisztult, begyazott szkriptnyelv
A Lua kilg a trgyalt modern szkriptnyelvek sorbl, mivel begyazott krnyezetre tervez-
tk. Ez egyszer ubb nyelvet, rvidebb kdot, s ezzel egytt kisebb funkcionalitst von maga
utn. (sszehasonltsul : a Lua 5.0 programknyvtrnak mrete Linux alatt 118 kB, a Perl
5.8.4- 1150 kB, a Ruby 1.8.2- pedig 748 kB.) A Lurl bevezet o jelleg u, magyar nyelv u
lers [3].
Fontosabb eltrsek a tbbi trgyalt modern szkriptnyelvt ol :
Nincs teljes, objektumorientlt kivtelkezels (de azrt lehet dobni s elkapni string
tpus kivteleket). Hiba esetn a hvsi verem elrhet o.
Az objektumorientlt programozs tmogatsa szokatlan. Mdszere [8] JavaScript pro-
totpusos megoldshoz ll kzel. Az rkl odst n. metatblk segtsgvel valstja
meg. Az objektummetdusait tartalmaz tblhoz csatolt metatbla lehet ov teszi, hogy
hinyz metdus hvsa esetn a Lua a metdust a szl o osztly tbljban keresse. (Me-
tatblkkal egybknt tetsz oleges objektum tetsz oleges opertora felldenilhat.)
A regulris kifejezsek egyszer ubbek, kevsb kifejez oek a Perlben s a POSIX ERE-
ben megszokottnl.
A szintaxisa kicsit fura pldul nem fogad el kifejezst utasts helyn.
Szokatlansga ellenre kerek, letisztult, tgondolt egszet alkot. Minden, a szkriptprog-
ramozshoz szksges nyelvi elemnek megvan benne a helye.
A Lua els o nagy felhasznli a jtkprogramok voltak (RPG-k s lvldz os jtkok
egyarnt). Azta tbb szvegszerkeszt o, IDE, webszerver (pl. lighttpd) s peer-to-peer kliens
(pl. BCDC) is szkriptelhet o Luban. rdekesnek grkezik a LuaT
E
X, amely a T
E
X s a Lua
tudst egyesti. Rszletes lista a Luban szkriptelhet o programokrl [10]-ben.
Megjegyezzk, hogy a webszerver szkriptelse nem ugyanaz, mint a webalkalmazsok
rsa egy az szkriptnyelven a webszerver felhasznlsval. A webalkalmazsok ltalban a
tartalmat generljk, ezzel szemben a webszerverhez rt szkriptek pl. a krs kiszolglsa
el ott vgeznek jogosultsgellen orzst, az URL-trst valstjk meg, s arrl dntenek, hogy
ez oldal vltozott-e a bngsz oben lev o cache-elt vltozathoz kpest. Az Apache mod_perl,
mod_python s mod_ruby moduljai s a Caudiumban fut Pike mind szkriptelsre, mind
webalkalmazsok rsra alkalmasak, mg az Apache PHP-modulja inkbb csak webalkal-
mazsokra, a lighttpd Lua-modulja pedig csak szkriptelsre j.
A Lua megjelense el ott a komolyabb szvegszerkeszt ok vagy sajt szkriptnyelvet tartal-
maztak (pl. Vim, Emacs, Epsilon), vagy kiegszt okkel Perlben vagy Pythonban voltak
szkriptelhet ok (pl. Vim). Mi lehet az oka, hogy jabban egyre tbb szoftver vlasztja a Lut az
ltalnos cl, nagy szkriptnyelvek helyett ? A kis mrete mellett a telepts egyszer usge
(f oleg Windows alatt) is fontos ok. Emellett a Lua C-interfsze s forrsa jobban tlthat s
rthet o, mint egy nla sokkal nagyobb szkriptnyelv ezzel cskken a nehezen reprodukl-
hat, verzifgg o s rendszerfgg o hibk valszn usge. Az alkalmazsfejleszt ok szmra
teht kisebb teher s kisebb kockzat a Lut beemelni, mint a nagy szkriptnyelveket.
166 Szab Pter
Hivatkozsok
[1] ACM Software System Award djak.
URL http://awards.acm.org/software%5Fsystem/.
[2] Brthzi Andrs: Ruby on Rails, 2005. augusztus.
URL http://weblabor.hu/cikkek/rubyonrails.
[3] Bevezet o lers a Lua-rl, els osorban BCDC-seknek.
URL http://ro.4242.hu/cgi-bin/yabb2/YaBB.pl?board=bcdc
_
help.
[4] BusyBox: a begyazott Linux svjcibicskja. URL http://www.busybox.net/.
[5] CPAN: a Perl-modulok kifogyhatatlan trhza. URL http://www.cpan.org/.
[6] dc implementci sed-ben.
URL http://sed.sourceforge.net/grabbag/scripts/dc.sed.
[7] GNU szoftverfordtsi rendszer.
URL http://en.wikipedia.org/wiki/GNU
_
build
_
system.
[8] Roberto Ierusalimschy: Objektum-orientlt programozs Lua-ban, 2003.
URL http://www.lua.org/pil/16.html.
[9] Brian W. Kernighan Rob Pike: A UNIX opercis rendszer. 1987, M uszaki Knyvki-
ad, Budapest.
[10] Luban szkriptelhet o programok listja. URL http://www.lua.org/uses.html.
[11] Mike Rosulek: Csak kulcsszavakbl ll Perl-szkript, 2003.
URL http://perlmonks.org/?node=Obfuscated%20Code.
[12] Szab Pter : A magic header for starting Perl scripts. 2003. prilis., The Perl Journal,
1315. p. URL http://i.cmpnet.com/ddj/tpj/images/tpj0304/0304tpj.pdf.
[13] Szab Pter : Perl-modulok teleptse a CPAN-r ol, 2005.
URL http://www.szszi.hu/wikidev/PerlModulokCPANr%C5%91l.
[14] Szkriptnyelvek. URL http://en.wikipedia.org/wiki/Scripting
_
language.
[15] Szoftverfordts automatizlsa.
URL http://en.wikipedia.org/wiki/Build
_
Automation.
[16] Szndkosan nehezen rthet ore rt rvid Perl-szkriptek.
URL http://perlmonks.org/?node=Obfuscated%20Code.
[17] UNIX-loza. URL http://en.wikipedia.org/wiki/Unix
_
philosophy.
[18] Verhs Pter : Perl rviden.
URL http://www.szabilinux.hu/verhas/perl/index.html.
[19] Wikipedia: szabad enciklopdia. URL http://en.wikipedia.org/.

You might also like