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

illetve 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és

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

Változóbehelyettesítés

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=$VAR

hatására a var shell-változó felveszi környezeti változópárja (VAR) értékét, míg a

setenv VAR $var

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

A C shell belső változói

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 az

unset 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 a

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

mail

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.

 

Tartalomjegyzék