A Tcl programozási nyelv

Szabványos könyvtárak



A standard Tcl könyvtár

A standard Tcl könyvtár a beépített Tcl lehetőségeket terjeszti ki Tcl-ben megírt részekkel. A könyvtárt alkotó fájlokat tároló fájlrendszerbeli könyvtár nevét az info library paranccsal kérdezhetjük le. A könyvtár inicalizálása az ebben található init.tcl végrehajtásával történik. A tclsh ezt automatikusan megteszi helyettünk.

Automatikus betöltés

A standard Tcl könyvtár részét képezi egy olyan unknown eljárás, amely többek között lehetővé teszi definiálatlan eljárások automatikus betöltését. Ehhez a könyvtár több segédeljárást is tartalmaz, amelyek önállóan is használhatók.

auto_mkindex könyvtár minta ?minta ...?
Ahhoz, hogy az automatikus betöltés működjön, az automatikusan betöltendő scripteket tartalmazó könyvtárban létre kell hozni egy tclIndex nevű indexfájlt, amely megadja, hogy az egyes eljárások definíciója mely fájlban található. Az indexfájl az auto_mkindex paranccsal hozható létre, argumentumként meg kell adni egy könyvtár nevét és egy vagy több fájlnévmintát (utóbbiak értelmezése a glob parancs szerint történik). Az auto_mkindex a megadott fájlokból kikeresi az összes eljárásdefiníciót és elkészíti az indexet.

Az eljárások keresése egyszerű módszerrel történik: az auto_mkindex csak azokat az eljárásdefiníciókat ismeri fel, amelyeknek proc kezdőszava a sor elején áll. Az eljárás neveként az auto_mkindex az ilyen sor második szavát tekinti. Egyéb eljárásdefiníciók (például olyanok, amelyekben a proc előtt szóközök állnak) figyelmen kívül maradnak.

auto_load eljárásnév
Az auto_load parancs megkísérli a megnevezett eljárást betölteni. Az átfésülendő könyvtárakat legmagasabb prioritással a globális auto_path változó határozza meg, melynek tartalma könyvtárnevek listája. Ha az auto_path változó nem létezik, a TCLLIBPATH környezeti változóban tárolt lista adja meg a könyvtárneveket. Ha ez utóbbi sem létezik, akkor a keresés a Tcl könyvtár könyvtárában történik.

Az átfésülendő könyvtárakban az auto_load az auto_mkindex által létrehozott tclIndex fájlban keresi a betöltendő eljárás definíciójának helyét. Ha valamelyikben megtalálja, a megfelelő script fájl végrehajtásával megpróbálja létrehozni az eljárást. Ha sikerül, 1-et ad vissza.

Ha az eljárás betöltése nem sikerül, mert az eljárás nem szerepelt egyik indexfájlban sem, vagy a végrehajtott script nem definiálta az eljárást, az auto_load visszatérési értéke 0. A keresés vagy a betöltendő script végrehajtása közben fellépő hibát az auto_load továbbadja.

Az auto_load a háttértárról csak egyszer olvassa be az indexfájlokat; az indexfájlokból kinyert információt a globális auto_index tömbben tárolja. A tárolt információ törlését az auto_reset paranccsal kényszeríthetjük ki.

auto_execok parancsnév
Az auto_execok parancs eldönti, hogy a létezik-e a megadottal megegyező nevű végrehajtható fájl a PATH környezeti változóban szereplő könyvtárakban. Ha igen, 1-et, különben nullát ad vissza.

A keresett parancsokról az auto_execok a globális auto_execs tömbben megjegyzi, hogy léteznek-e vagy sem, elkerülvén ezzel a háttértáron való ismételt keresést. A tárolt információ törlését az auto_reset paranccsal kényszeríthetjük ki.

auto_reset
Törli az auto_load és az auto_execok parancsok által felhalmozott információkat, valamint az automatikusan betölthetők indexében szereplő eljárásokat. A törölt dolgok újraolvasása a háttértárról igény esetén történik meg.

unknown parancsnév ?arg ...?
Amikor a Tcl interpreter nem létező parancs hívásával kerül szembe, meghívja az unknown eljárást, és arugmentumként átadja neki a nem létező parancs nevét és a hívás argumentumait (az átadott argumentumokon már megtörténtek a helyettesítések). Az unknown sorrendben a következőkkel próbálkozik:
  1. Az ismeretlen parancsot az auto_load segítségével megpróbálja mint eljárást betölteni. Ha ez sikerül, a parancsot megismétli az eredeti argumentumokkal. Ezt a próbálkozást letilthatjuk a globális auto_noload változó létrehozásával.
  2. Ha a betöltés nem járt sikerrel, az auto_execok-val megvizsgálja, hogy létezik-e a paranccsal megegyező nevű végrehajtható fájl. Ha létezik, az exec paranccsal végrehajtja az eredeti argumentumokra. Ezt a próbálkozást letilthatjuk a globális auto_noexec változó létrehozásával.
  3. Amennyiben alfolyamatként sem sikerült a parancsot végrehajtani, és a parancsot a felhasználó adta ki interaktív üzemmódban, két további próbálkozásra kerül sor:
    • Ha a parancs a C-shell jelöléseinek valamelyikével a történeti listára hivatkozik, az unknown történeti helyettesítést hajt végre.
      Jelölés Végrehajtott parancs
      !! az előző parancs
      !n ha n pozitív, az n. parancs, ha negatív, az n-el ezelőtti parancs
      ^régi^új?^? az előző parancs, benne régi minden előfordulása újra helyettesítve
    • Ha a parancs egyéb alakú, és a létező Tcl parancsok valamelyikének egyértelmű prefixe, az unknown kiterjeszti a parancs nevét és meghívja a parancsot az eredeti argumentumokkal.

Ha fenti kísérletek valamelyike sikerrel jár, az unknown az általa végrehajtott parancs visszatérési értékét adja vissza, különben hibát generál.

Működése közben az unknown az globális unknown_pending tömbben tartja nyilván, hogy mely eljárások automatikus betöltése van folyamatban. Ennek segítségével ismeri fel, ha az automatikus betöltés végtelen rekurzióba kerül.

Fájlkezelés

A Tcl fájlkezelő parancsai számára úgy kell megadni a fájlneveket, ahogyan az a unix rendszerekben szokás. A gyökérkönyvtárhoz és az aktuális könyvtárhoz relatív fájlnevek mellett használhatunk home-könyvtárhoz relatív fájlneveket is. A C-shell mintájára a Tcl is tilda-helyettesítéssel oldja ezt meg: a '~/' kezdetű fájlnevek a HOME környezeti változóban szereplő könyvtárhoz, a '~név/' kezdetű fájlnevek a név azonosítójú felhasználó home-könyvtárához relatívak.

Mint a legtöbb programozási nyelvben, a Tcl-ben is meg kell nyitnunk egy fájlt, hogy használhassuk. A megnyitással kapunk egy azonosítót, amellyel a további műveletek során a fájlra hivatkozunk. A Tcl interpretert végrehajtó unix folyamat standard fájljait megnyitás nélkül használhatjuk, azonosítójuk rendre stdin, stdout és stderr.

A Tcl parancsaival gyakorlatilag csak szöveges fájlokat kezelhetünk. Ennek az az oka, hogy a Tcl a stringeket C stringekkel reprezentálja, s így azok null-karaktert nem tartalmazhatnak. Mivel a fájlműveletek stringeket írnak és olvasnak, nem tudunk null-karaktereket írni vagy olvasni.

Fájlok megnyitása és lezárása

open fájlnév ?hozzáférés? ?engedélyek?
Az open parancs két különböző funkciót hajt végre aszerint, hogy a fájlnév '|' karakterrel kezdődik-e, vagy sem.

Ha a fájlnév első karaktere nem '|', az open parancs megnyitja a megadott fájlt, és visszaad egy azonosítót, amellyel a fájlra a fájlkezelő parancsokban hivatkozhatunk.

A második paraméterrel határozzuk meg a megnyitás módját. Két forma közül választhatunk:

  1. A C könyvtár fopen függvényénél is használt formában egy- vagy kétkarakteres stringet adunk meg:
    r Megnyitás csak olvasásra. A fájlnak a megnyitáskor már léteznie kell. Ez az alapértelmezés.
    r+ Megnyitás írásra és olvasásra. A fájlnak a megnyitáskor már léteznie kell.
    w Megnyitás csak írásra. Ha a megnyitáskor a fájl még nem létezik, létrejön, ha már létezik, nulla hosszúságúra csonkolódik.
    w+ Megnyitás írásra és olvasásra. Ha a megnyitáskor a fájl még nem létezik, létrejön, ha már létezik, nulla hosszúságúra csonkolódik.
    a Megnyitás csak írásra. A fájlnak a megnyitáskor már léteznie kell. A fájlra vonatkozó író műveletek a fájl végéhez fogják fűzni az adatokat.
    a+ Megnyitás írásra és olvasásra. Ha a fájl a megnyitáskor még nem létezik, létrejön. A fájlra vonatkozó író műveletek a fájl végéhez fogják fűzni az adatokat.

  2. POSIX hozzáférési jelzőket adunk meg egy listában:
    RDONLY* Megnyitás csak olvasásra.
    WRONLY* Megnyitás csak írásra.
    RDWR* Megnyitás írásra és olvasásra.
    APPEND A fájlra vonatkozó író műveletek a fájl végéhez fogják fűzni az adatokat.
    CREAT A megnyitással a fájl létrejön, ha még nem létezik (ezen jelző nélkül hibát okoz, ha nem létező fájlt próbálunk megnyitni).
    EXCL A CREAT jelzővel együtt alkalmazva hatására hibát okoz, ha a megnyitáskor a fájl már létezik.
    NOCTTY Terminál megnyitásakor megakadályozza, hogy a terminál a folyamat vezérlő termináljává váljon.
    NONBLOCK A fájlra vonatkozó műveletek nem fogják blokkolni a folyamatot. Lásd erről a jelzőről a rendszer open hívásának dokumentációját is.
    TRUNC Megnyitáskor a fájl nulla hosszúságúra csonkolódik, ha már létezik.
    *Ezek közül pontosan egyet kell megadni.

A hozzáférési pozíció a megnyitás után a fájl elején lesz. Kivételt képeznek ezalól az író műveletek, ha 'a', 'a+' vagy APPEND jelzős módban nyitottuk meg a fájlt. Ilyenkor a fájlba írt adatok a hozzáférési pozíciótól függetlenül a fájl végéhez fűződnek.

Amennyiben írásra és olvasásra nyitottuk meg a fájlt, csak úgy szabad író és olvasó műveletek között váltani, hogy közben kiadunk egy seek parancsot.

Az opcionális harmadik paraméternek egész számnak kell lennie. Vele adhatjuk meg, hogy ha a megnyitással létre kell hozni a fájlt, akkor az milyen, a felhasználókra vonatkozó hozzáférési engedélyekkel jöjjön létre. A megadott érték a folyamat fájlhozzáférési engedély maszkjával együtt dönt az eredő engedélyekről (lásd az umask rendszerhívás dokumentációját). Az alapértelmezés oktális 0666.

Ha az open parancsnak '|' karakterrel kezdődő fájlnevet adunk meg, akkor nem közönséges fájlt nyitunk meg, hanem a '|' karakter mögé írt unix parancs pipeline végrehajtását kezdeményezzük (a parancs pipeline megadásának szintaxisáról lásd az exec parancsot). Ebben az esetben a visszaadott azonosítóra végzett író műveletek a pipeline inputjára írnak, az olvasó műveletek a pipeline outputjáról olvasnak.

Ha csak olvasásra nyitottuk meg a pipeline-t, a pipeline inputja a Tcl interpretert végrehajtó folyamat inputja lesz, hacsak a pipeline megadásában másként nem rendelkezünk. Hasonlóan, ha csak írásra nyitottuk meg a pipeline-t, a pipeline outputja a Tcl folyamat outputjára kerül.

close azonosító
A close parancs lezárja a megadott fájlt, illetve megvárja a pipeline részét képező folyamatok befejeződését. Az azonosítót a továbbiakban már nem használhatjuk. A parancs üres stringet ad vissza, de előfordulhat, hogy végrehajtása közben hiba lép fel.

Író és olvasó műveletek

puts ?-nonewline? ?azonosító? string
A puts parancs a string karaktereit kiírja az azonosítóval megadott fájlba, alapértelmezésben a stdout-ra. Ha nem adjuk meg a -nonewline kapcsolót, a string karakterei után még egy újsor karaktert is kiír. Csak olyan fájlba írhatunk, amelyet írásra is megnyitottunk.

Mivel az író műveletek puffereltek, a puts parancs végrehajtása után nem garantált, hogy a string karakterei ténylegesen kiíródnak. Ha mégis biztosak szeretnénk lenni ebben, akkor használjuk a flush parancsot.

flush azonosító
A flush parancs a megadott fájlba ténylegesen kiírja a pufferelt és még kiíratlan adatokat. Üres stringet ad vissza.

gets azonosító ?változónév?
A gets parancs a megadott fájlból beolvas egy egész sort, és törli végéről az újsor karaktert (kivéve, ha a fájl utolsó sorát nem zárja újsor karakter, ekkor nincs mit törölni). Csak olyan fájlból olvashatunk, amelyet olvasásra is megnyitottunk.

Ha megadtunk egy változónevet is, a parancs értékül adja neki a sort, és visszaadja az olvasott karakterek számát (az újsor karaktert nem beleszámítva). Ha a fájlból egyetlen karaktert sem sikerül olvasni, mert az véget ért, a változóba üres string kerül és a visszatérési érték -1 lesz.

Ha nem adtunk meg változónevet, akkor a sor tartalma a parancs visszatérési értéke lesz. A üres stringet ad vissza, ha a fájl véget ért, de akkor, ha a sor üres. A két eset megkülönböztetésére használjuk a eof parancsot.

read ?-nonewline? azonosító
read azonosító méret
A read parancs első formájában egy darabban beolvassa és visszaadja a megadott fájl hátralevő részét. Ha használjuk a -nonewline kapcsolót, törli a fájl utolsó karakterét, ha az újsor karakter.

A második formában a parancs méret darab karaktert olvas, de legfeljebb annyit, amennyi még a fájl végéig hátra van. A visszatérési érték ekkor is a beolvasott karaktersorozat.

Csak olvasásra is megnyitott fájlból olvashatunk.

eof azonosító
Az eof parancs egyet ad vissza, ha az előző olvasó művelet elérte a fájl végét, különben nullát.

Hozzáférési pozíció

Minden megnyitott fájlhoz tartozik egy hozzáférési pozíció, amely meghatározza, hogy a következő művelet a fájl hányadik karakterét írja vagy olvassa. A műveletek a hozzáférési pozíciót az utoljára írt vagy olvasott karakter mögé állítják, vagyis ha másképpen nem rendelkezünk, a műveletek ott folytatják a fájl írását vagy olvasását, ahol azt előzőleg abbahagytuk.

Bizonyos fájlok esetén nincsen más választásunk, minthogy végigírjuk vagy végigolvassuk őket. Ilyenek például a terminálra csatlakozó fájlok vagy a pipeline-ok. A tényleges, lemezen tárolt fájlok esetében viszont lehet értelme annak, hogy a fájlt ne szekvenciálisan írjuk vagy olvassuk, hanem kedvünk szerint mozogva.

seek azonosító távolság ?kiindulópont?
A seek parancs lehetővé teszi, hogy megváltoztassuk egy fájl hozzáférési pozícióját. Az új hozzáférési pozíciót egy viszonyítási ponthoz relatívan, előjeles számmal adjuk meg. A viszonyítás pont a következők egyike lehet:

start
Pozícionálás a fájl elejéhez képest. Ez az alapértelmezés. Nulla távolság a fájl első karakterére állítja a hozzáférési pozíciót.
current
Pozícionálás a jelenlegi pozícióhoz képest. Nulla távolság a jelenlegi pozíció megtartását jelenti, negatív távolság visszafelé, pozitív távolság előrefelé mozdítja a hozzáférési pozíciót.
end
Pozícionálás a fájl végéhez képest. Nulla távolság a fájl utolsó karaktere mögé, negatív távolság a fájl vége elé, pozitív távolság a fájl végen túlra állítja a hozzáférési pozíciót (utóbbiról lásd az lseek rendszerhívás dokumentációját).
A seek parancs visszatérési értéke üres string.

tell azonosító
A tell parancs visszaadja a megadott fájl hozzáférési pozícióját.

A munkakönvtár

cd ?könyvtárnév?
A cd parancs megváltoztatja a Tcl interpretert futtató folyamat munkakönyvtárát. A könyvtárnévben használhatunk tilda-helyettesítést. Az alapértelmezett könyvtárnév a '~/'. A parancs üres stringet ad vissza.

pwd
A Tcl interpretert futtató folyamat munkakönyvtárának nevét adja vissza.

További lehetőségek

glob ?kapcsolók? minta ?minta ...?
A glob parancs a megadott minták valamelyikére illeszkedő létező fájlok neveinek listáját adja vissza. Hibát okoz, ha nem léteznek ilyen fájlok. A mintákban közönséges karaktereken túl a C-shell jelöléseit használhatjuk:

? Tetszőleges karakterre illeszkedik.
* Tetszőleges, akár nulla hosszúságú karaktersorozatra illeszkedik.
[karakterek] A szögletes zárójelek közé írt karakterekre illeszkedik. Ha valamely két karakter között kötőjel áll, az ASCII kód értelmében a két karakter közé eső karakterekre is illeszkedik.
\x Az x karakterre illeszkedik. Így semlegesíthetjük a *?[]\ karakterek speciális jelentését.
{s,t,...} A vesszővel elválasztva felsorolt stringekre illeszkedik.

A fájlnév elején vagy közvetlenül '/' karaktert mögött álló '.' karaktert a mintának explicit módon tartalmaznia kell, hogy illeszkedjen. Ugyanez igaz magukra a '/' karakterekre is.

A mintát '~' karakterrel kezdve ugyanúgy megadhatunk home-könyvtárhoz relatív hivatkozást, mint közönséges fájlnevek esetében.

A glob parancs két kapcsolót támogat:

-nocomplain
Hiba helyett üres lista az eredmény, ha a minták egyike sem illeszkedik létező fájl nevére.
--
A kapcsolók sorának végét jelzi. A következő argumentum még akkor sem számít kapcsolónak, ha kötőjellel kezdődik.

A glob parancs a következőkben tér el a C-shell viselkedésétől:
file művelet fájlnév ?arg ...?
A file több különböző műveletet valósít meg egy parancsban.

file dirname fájlnév
A fájlnév utolsó '/' karakterét megelőző részét adja vissza. Ha a fájlnév utolsó '/' karaktere a fájlnév első karaktere, a visszatérési érték egy '/' karakter, ha a fájlnév egyáltalán nem tartalmaz '/' karaktert, egy '.' karakter.

file tail fájlnév
A fájlnév utolsó '/' karakterével kezdődő részét adja vissza. Ha a fájlnév nem tartalmaz '/' karaktert, a visszatérési érték maga a fájlnév.

file rootname fájlnév
A fájlnév utolsó '.' karakterét megelőző részét adja vissza. Ha a fájlnév nem tartalmaz '.' karaktert, a visszatérési érték maga a fájlnév.

file extension fájlnév
A fájlnév utolsó '.' karakterével kezdődő részét adja vissza. Ha a fájlnév nem tartalmaz '.' karaktert, a visszatérési érték az üres string.

file readlink fájlnév
A fájlnévvel megadott szimbolikus link értékét adja vissza. Ha nem szimbolikus linket adunk meg, hiba lép fel.

file exists fájlnév
Egyet ad vissza, ha a megnevezett fájl létezik, és a Tcl interpretert futtató felhasználónak van keresési joga az ahhoz vezető könyvtárakban, különben nullát.

file owned fájlnév
Egyet ad vissza, ha a megnevezett fájl a Tcl interpretert futtató felhasználó tulajdonában van, különben nullát.

file readable fájlnév
Egyet ad vissza, ha a megnevezett fájlra a Tcl interpretert futtató felhasználónak van olvasási joga, különben nullát.

file writable fájlnév
Egyet ad vissza, ha a megnevezett fájlra a Tcl interpretert futtató felhasználónak van írási joga, különben nullát.

file executable fájlnév
Egyet ad vissza, ha a megnevezett fájlra a Tcl interpretert futtató felhasználónak van végrehajtási joga, különben nullát.

file isfile fájlnév
Egyet ad vissza, ha a megnevezett fájl közönséges fájl, különben nullát.

file isdirectory fájlnév
Egyet ad vissza, ha a megnevezett fájl könyvtár, különben nullát.

file type fájlnév
A megnevezett fájl típusára utaló stringet ad vissza, amely lehet file, directory, characterSpecial, blockSpecial, fifo, link vagy socket.

file size fájlnév
A megnevezett fájl bájtokban mért méretét adja vissza. Ha a fájl nem létezik, vagy mérete egyéb okból nem lekérdezhető, hiba lép fel.

file atime fájlnév
A megnevezett fájlon végzett utolsó hozzáférés időpontját adja meg a POSIX szabvány szerint, valamely rögzített időpont (általában 1970. január 1.) óta eltelt másodpercekben.

file mtime fájlnév
A megnevezett fájlon végzett utolsó módosítás időpontját adja meg a POSIX szabvány szerint, valamely rögzített időpont (általában 1970. január 1.) óta eltelt másodpercekben.

file stat fájlnév tömbnév
A megnevezett fájlra végrehajtja a stat rendszerhívást, és a kapott információkat a megadott tömb következő elemeinek adja értékül: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type, uid. A tömb type elemébe a file type parancsban felsorolt értékek egyike, a többi elembe egész szám kerül. Az adatok jelentéséről lásd a stat rendszerhívás dokumentációját. Maga a parancs üres stringet ad vissza.

file lstat fájlnév tömbnév
Abban különbözik a stat művelettől, hogy a stat helyett az lstat rendszerhívást használja. Ezért ha a fájlnév egy szimbolikus linket ad meg, a tömbben visszaadott információk magára a szimbolikus linkre, és nem az általa hivatkozott fájlra vonatkoznak.

file copy ?-force? ?--? forrás cél
file copy ?-force? ?--? forrás ?forrás ...? célkönyvtár
Fájlmásolás. A -force kapcsoló hatására felülírja a már létező fájlt. A -- a kapcsolók végét jelzi. Kötőjellel kezdődő fájlnevek esetén használandó.
file delete ?-force? ?--? útvonal ?útvonal ...?
Fájltörlés. A -force kapcsoló hatására törli a nem üres könyvtárakat is.
file mkdir könyvtár ?könyvtár ...?
Könyvtár létrehozása.
file rename ?-force? ?--? forrás cél
file rename ?-force? ?--? forrás ?forrás ...? célkönyvtár
Átnevezi, illetve átmozgatja a megadott fájl(oka)t. A -force kapcsoló hatására felülírja a már létező fájlt.
tcl8.0  
file attributes fájlnév ?-owner user? ?-group group ?-permissions oktális_kód?
Beállítja a fájl tulajdonosait és elérési jogait. Ha csak a fájl nevét adjuk paraméterül, akkor a fájl attribútumaival tér vissza.

Egyéb

parray tömbnév
A parray eljárás a megnevezett tömböt kinyomtatja a standard outputra. A tömbnek a hívó számára láthatónak kell lennie.