Shell-változók
A C shell változói, noha alapvetően ugyanúgy használandóak, mint a standard Bourne shell változói, számos dologban eltérnek azoktól. Tán az egyik legfontosabb különbség, hogy a C shell változói tömbváltozók is lehetnek, s e tömb elemeit egyenként is állíthatjuk, illetve hivatkozhatunk rájuk.
A C shell változónevei maximum 20 karakter hosszúak lehetnek, alfanumerikus karaktereket, valamint az aláhúzás jelet tartalmazhatják, s betűvel vagy aláhúzás karakterrel kezdődhetnek.
Értékadás és hivatkozás változókra
A C shell változóihoz a set paranccsal rendelhetünk értéket, illetve e paranccsal kérdezhetjük le az aktuális beállításokat. Ha argumentum nélkül adjuk ki a set parancsot, a már látott módon kilistázza a beállított shell-változók értékét. A tényleges értékadás a
set
var = valueilletve tömbváltozó esetén a
set
var = ( wordlist )formában történhet, ahol var a változó neve, value, illetve tömbváltozó esetén wordlist a változóhoz rendelt érték. Tömbváltozó elemeit kerek zárójelek közé zárva, egymástól szóközzel elválasztva kell megadni, a shell is ilyen formában, de zárójelek nélkül listázza ki őket:
hp 75: set elso = 1; echo $elso
1
hp 76: set masodik = ( 2 harom 4 ot ); echo $masodik
2 harom 4 ot
hp 77:
Egy változót az unset paranccsal lehet törölni.
A fenti példákból is láthatóan, akárcsak a Bourne shell-nél, itt is a $var megadással lehet egy változóra hivatkozni. A kétértelműségek elkerülésére itt is használható és célszerű is használni a ${var} jelölésmódot, ami funkcionálisan ekvivalens az előzővel, de nem ad módot a változónév és az utána írt karakterek összekeverésére.
Tömbváltozók elemeire hivatkozáskor a $var[index], illetve a ${var[index]} megadás használható. (Az index argumentumon szükség esetén változóbehelyettesítést is végrehajt a shell.) Maga az index lehet egyetlen szám, lehet * (ez az összes elemet kijelöli), valamint tól-ig jellegű megadás is használható: értelemszerűen var[m-n] az m-ediktől az n-edikig terjedő elemeket jelöli ki, félig üres megadásnál pedig var[-n] az elsőtől az n-edikig, míg var[m-] az m-ediktől az utolsóig hivatkozik a tömbváltozó elemeire.
Számos változót csak kapcsolóként használ a shell, a konkrét értékét nem nézi, csak azt, hogy be van-e kapcsolva (set var), vagy sem (unset var). Ilyen jellegűek azok a változók, amelyek a shell viselkedését befolyásolják, mint például a filec, noclobber stb.
Numerikus shell-változók és kifejezések
Mint láttuk, a set paranccsal tudunk egy shell-változónak értéket adni. Ez az érték karaktersorozat lesz. Ha numerikus értékadást szeretnénk, tehát arra volna szükségünk, hogy az adott shell-változó valamilyen numerikus művelet eredményét tárolja számként, a set parancs helyett az "at" jelet (@) használjuk:
hp 28: set sum=5+4 # stringkent kezeli
hp 29: echo $sum
5+4
hp 30: @ sum=5+4 # az argumentumokat kulon kell irni!
@: Badly formed number.
hp 31: @ sum=5 + 4 # szamokkent kezeli
hp 32: echo $sum
9
hp 33: set sum1=$sum+3 # megint string lesz
hp 34: echo $sum1
9+3
hp 35: @ sum2 = $sum + 3 # megint szam lesz
12
hp 36:
A numerikus értékadás parancsának három formája van:
@
@
név = kifejezés@
név[index] = kifejezésHa csak a @ karakter szerepel parancsként, ez teljesen ekvivalens az argumentumok nélkül kiadott set paranccsal, azaz kilistázza a beállított shell-változókat (nem csak a numerikusokat!). A második megadási módra láttunk példát a fentiekben, a harmadik pedig tömbváltozók indexelt elemeinek értékét állítja be, a C nyelvben megszokott szintaxis szerint.
A shell-változókon a C shell mindig megpróbál változóbehelyettesítést végrehajtani, azaz ha valamilyen speciális metakarakter szerepel a változó nevében, az ennek megfelelő behelyettesítést végrehajtja, s az ennek eredményeképpen adódó új argumentumot helyettesíti be a régi helyére. A behelyettesítések megakadályozására a változónév hivatkozásokban vagy a $ jel elé kell egy backslash karaktert elhelyezni (például \$myvar ), vagy pedig szimpla idézőjelek közé kell zárni a hivatkozott változó nevét ( '$myvar' ).
A C shell az alábbi speciális változóbehelyettesítési konstrukciókat használja:
$#name ${#name} |
A name változóban lévő szavak számát (azaz a tömbváltozó elemeinek számát) adja meg. |
$0 |
Annak a fájlnak a nevét helyettesíti be, ahonnan a bemenetet olvassa. |
$ n, ${n} |
Az n-edik pozicionális paraméter. (Egyenértékű a $argv[n] megadással.) |
$* |
Az összes pozicionális paraméter ($0 kivételével). (Egyenértékű a $argv[*] megadással.) |
A fenti mechanizmusokra használhatóak az alábbi eseménymódosítók is: :e, :h, :t, :r, :q, és :x, valamint a :gh, :gt és :gr. (Gyakran használatosak például a pozicionális paraméterként átadott fájlnevek "megtisztítására", a katalógus és/vagy kiterjesztések levágására.)
Az alábbi behelyettesítések esetén nem lehet eseménymódosítókat használni.
$?var, ${?var} |
Ha var be van állítva, az 1 értéket helyettesíti be, ha var nincs beállítva, a 0 értéket. |
$?0 |
Az 1 értéket helyettesíti be, ha a bemeneti fájl ismert, 0 értéket, ha nem. |
$$ |
A futó folyamat folyamatazonosítóját adja vissza. |
$< |
A standard bemenetről beolvas egy sort (további behelyettesítést nem hajt rajta végre), és azt helyettesíti be. |
Környezeti- és shell-változók a C shell-ben
A Bourne és a Korn shell változókezeléséhez képest a C shell egy igen bonyolult, mondhatni túlbonyolított változókezelési módszert alkalmaz. Először is, a C shell változói két csoportra vannak osztva: közönséges shell-változókra (shell variables), illetve környezeti változókra (environment variables). A környezeti változókat (ezeket rendszerint nagybetűvel írják) a C shell automatikusan exportálja a benne meghívott programoknak, míg a shell-változókat nem (ha shell-változót akarunk exportálni, akkor a setenv parancsával tehetjük meg).
Az alábbi két példa a normál, illetve a környezeti shell-változókat mutatja (figyeljük meg a path és a PATH eltérő szintaxisát):
hp 1: set # normal valtozok
argv ()
autologout 60
cwd /users/demo
history 20
home /users/demo
noclobber
path (/bin /usr/bin /usr/contrib/bin /usr/local/bin .)
prompt hp !:
savehist 20
shell /bin/csh
status 0
system hp
term sun-cmd
A környezeti változók ugyanekkor:
hp 2: setenv # kornyezeti valtozok
HOME=/users/demo
PATH=/bin:/usr/bin:/usr/contrib/bin:/usr/local/bin:.
LOGNAME=demo
TERM=sun-cmd
SHELL=/bin/csh
MAIL=/usr/mail/demo
MANPATH=/usr/man:/usr/contrib/man:/usr/local/man
TZ=MET-1METDST
A C shell ezenkívül egyes fontos változókat megkülönböztetetten kezel, s ezeket mind normál, mind környezeti változóként nyilvántartja. E shell-változók közül néhány (zárójelben a megfelelő környezeti változók neve): user (USER), home (HOME), term (TERM), path (PATH), shell (SHELL) stb.
Néhány ilyen változópárnál a két változó közt semmi kapcsolat nincs, a shell indulásakor azonos értékre állítja be őket a rendszer (még ez se törvényszerű), a továbbiakban teljesen függetlenek egymástól, s ha "szinkronizálni" akarjuk őket, nekünk kell kiadni a megfelelő parancsokat.
set
var=$VARhatására a var shell-változó felveszi környezeti változópárja (VAR) értékét, míg a
setenv
VAR $varparancs hatására a VAR környezeti változót frissíthetjük fel a normál var shell-változó értékével. Ilyen jellegű változópárt alkot például a shell és a SHELL:
hp 7: set shell=/bin/ksh # shell valtozot modosit
hp 8: echo $shell $SHELL
/bin/ksh /bin/csh
hp 9: setenv SHELL /bin/sh # korny.valtozot modosit
hp 10: echo $shell $SHELL
/bin/ksh /bin/sh
A változópárok másik csoportjánál viszont, ha a felhasználó megváltoztatja a shell-változót, a megfelelő környezeti változó automatikusan felfrissítődik; ugyanakkor fordított irányban ez nem áll fenn. Ebbe a csoportba tartoznak a user (USER), a home (HOME) és a term (TERM) változópárok, valamint - némiképp kakukktojásként - egyes C shell implementációkban a cwd (PWD) változók is:
hp 21: echo $term $TERM
sun-cmd sun-cmd
hp 22: set term=vt100; echo $term $TERM
vt100 vt100
hp 23: setenv TERM sun-cmd; echo $term $TERM
vt100 sun-cmd
hp 24:
Végül - csak hogy az eddig se egyszerű modell még követhetetlenebb legyen - van egyetlenegy olyan változópár, a path (PATH), ahol a normál- és a környezeti shell-változók között kétirányú kapcsolat áll fenn, azaz bármelyik változtatásakor automatikusan frissítődik a másik is; ehhez képest már üdítő ráadásként hat, hogy e két változónak a szintaxisa is eltérő, a PATH a UNIX alatt megszokott módon, kettőspontokkal választja el az egyes elemeket (hiszen ezt a változót dolgozzák fel az egyéb programok), a path változóban viszont szóközzel elválasztva vannak felsorolva a katalógusok (ahogy az egy jólnevelt többelemű C shell-változóhoz illik)...
hp 65: echo $path; echo $PATH
/bin /usr/bin
/bin:/usr/bin
hp 66: set path = ( $path /etc ); echo $path; echo $PATH
/bin /usr/bin /etc
/bin:/usr/bin:/etc
hp 67: setenv PATH $PATH\:$HOME/bin; echo $path; echo $PATH
/bin /usr/bin /etc /users/demo/bin
/bin:/usr/bin:/etc:/users/demo/bin
hp 68:
(Figyeljük meg, hogy az utolsó példában a 67-es sorszámú parancsnál a kettőspont karaktert is le kellett védeni a backslash karakterrel, mert különben eseménymódosító metakarakterként kezelte volna a shell.)
Az alábbiakban a C shell belső shell-változóit tekintjük át, azokat, amelyeket maga a shell definiál és használ. Az alábbi lista szükségképpen nem teljes, mert a C shell implementációk között is jelentős különbségek vannak, ugyanakkor az is előfordulhat, hogy az általunk használt implementációban nem szerepel valamelyik itt szereplő változó.
A változók jelentős része logikai változó (boolean), amelyeknél a konkrét érték nem érdekes, csak az, hogy egyáltalán be vannak-e állítva, vagy sem. (Mint már láttuk, egy logikai változót (példának okáért a noclobber változót) a
set noclobber
paranccsal lehet "bekapcsolni", az
unset noclobber
paranccsal pedig "kikapcsolni".)
argv |
E változó a parancssori argumentumokat tartalmazza, úgy, ahogy a hívó shell azokat átadta. |
autologout |
Ha e változó értéke nem nulla, akkor a megadott (percekben mért) idő elteltével, ha azalatt nem használta a felhasználó a terminált, kilépteti a felhasználót a rendszerből. E szolgáltatást vagy a 0 érték beállításával, a set autologout=0 paranccsal, vagy azunset autologout paranccsal lehet letiltani. |
cdpath |
A path változóhoz hasonló, de ez a cd (valamint a chdir és popd) parancs végrehajtásában nyújt könnyebséget. Ha a cd parancs argumentuma relatív elérési útvonallal van megadva (nem a '/' jellel kezdődik) és az aktuális katalógus alatt nem található ilyen nevű katalógus, akkor a cdpath változóban szereplő katalógusokban keresi a megnevezett alkatalógust, s ha valahol talál ilyet, oda vált. Például ha demo néven jelentkeztünk be és a /users/demo katalógusban vagyunk, s a cdpath változót a set cdpath = ( ~/bin ~/local ) paranccsal állítottuk be, akkor ha kiadjuk acd tmp parancsot, a shell először a /users/demo/tmp katalógust keresi; ha ilyet nem talált, akkor a /users/demo/bin/tmp, végül pedig a /users/demo/local/tmp katalógust fogja keresni. |
cwd |
A munkakatalógus elérési útvonalát tartalmazza. Minden egyes cd parancs után frissítődik az értéke. Bejelentkezéskor a HOME változó értékét tartalmazza (ami viszont a /etc/passwd fájlban van megadva). |
filec |
Logikai változó; bekapcsolása esetén lehetővé teszi, hogy a már ismertetett módon használjuk a fájlnév kiegészítési mechanizmust (CTRL-D, illetve ESC). |
history |
Az eseménypufferben tárolt események (előző parancsok) száma. |
home |
A felhasználó alapkatalógusát adja meg. |
ignoreeof |
Logikai változó. Ha be van kapcsolva, akkor a CTRL-D hatására nem lehet kilépni a shell-ből, csak az exit, illetve login shell esetén a logout paranccsal. |
|
Azon fájlok listája, amelyeket a C shell postafájlként kezel; ha bármelyik mérete megváltozik, a C shell jelzi, hogy új levél érkezett. Ha az első eleme e változónak numerikus érték, a C shell az itt (másodpercben) megadott időközönként ellenőrzi le a postafájlokat. |
noclobber |
Logikai változó. Megbízható mentőöv a kezdő UNIX felhasználók számára: ha be van állítva a set paranccsal, akkor meggátolja a fájlok átirányítások révén bekövetkező módosítását. Természetesen a fájlok ekkor is módosíthatóak, de külön jelezni kell a '!' karakter használatával, hogy "komolyan gondoltuk" a dolgot. |
noglob |
Logikai változó. Beállítása esetén letiltja a fájlnév behelyettesítéseket. Shell script-ekben lehet hasznos, ha gondoskodni akarunk arról, hogy az átadott fájlnevek ne essenek áldozatául újabb nem várt behelyettesítéseknek. |
nonomatch |
Logikai változó. Beállítása esetén, ha egy fájlnév behelyettesítés nem jár eredménnyel, a behelyettesíteni próbált mintát adja vissza, nem pedig hibaüzenetet. |
notify |
Logikai változó. Beállítása esetén a háttérben indított folyamatok befejezéséről rögtön értesítést kapunk, egyébként csak a soron következő prompt kiírása előtt írja ki a háttérfolyamatok befejeztét. |
path |
A parancsok keresési útvonala. Az aktuális katalógusra a '.' karakterrel, illetve üres elemmel lehet hivatkozni. A shell indulásakor a PATH környezeti változóból kapja értékét, ha pedig változik, PATH is követi a módosulásokat. |
prompt |
A shell által kiírt parancspromptot definiálja. Nem interaktív shell-ek esetén, tehát amik shellscript-et futtatnak, vagy nem terminálról lettek elindítva, prompt értéke nincs beállítva. A prompt értékét a |
|
if ($?prompt == 0) feltétellel lekérdezve lehetőségünk nyílik arra, hogy azokat a parancsokat, amelyek nem-interaktív környezetben feleslegesek, ne futtassuk le, így jelentősen gyorsítható a shell-ek indítása. |
savehist |
A következő bejelentkezésre átmentett eseménypuffer mérete (sorokban). Az elmentett parancsokat a ~/.history fájlban tárolja a rendszer, s a felhasználó következő belépésekor ezekre is tud hivatkozni. |
shell |
Annak a parancsértelmezőnek a nevét tartalmazza, amelyik a shellscript-eket végrehajtja. |
status |
A legutolsó parancs visszatérési értéke. A szokásos konvenció szerint a shell beépített parancsai 0 értéket adnak vissza sikeres lefutás esetén, 1-et sikertelenség esetén, valamilyen abnormális esemény bekövetkeztekor pedig oktális 200 adódik hozzá. |
verbose |
Logikai változó. Az eseménybehelyettesítés megtörténte után kiírja a parancsot a képernyőre. Hibakeresésnél tehet jó szolgálatokat. |