Bevezetés
Kedvcsináló
E leírás célja, hogy képes legyél bash szkriptekben objektumokkal dolgozni, akár CygWin környezetben is. A bash egy rendkívül sokoldalú parancsértelmező, amely komoly programok írására is alkalmas. Érdemes tehát megoldani, hogy tudjon objektumokat is kezelni. A rendszert lépésről-lépésre alakítjuk ki úgy, hogy könnyen érthető legyen a megvalósítása és a működése. Az eredményül kapott OOB rendszer kevesebb, mint 250 programsort tartalmaz, mégis kényelmesen használható:
- osztályok építésére
- többes öröklődéssel,
- objektumok létrehozására,
- objektumok törlésére.
A létrehozott objektumok egyszerűen beilleszthetőek a bash szkriptekbe vagy futtathatóak az OOB saját környezetében is. Célszerű e leírás szerint megírni és kipróbálni a fájlokat, mert így mire végzünk az olvasással, már meg is tanuljuk az OOB használatát. Valójában írni sem nagyon kell, a kerettel megjelölt kódrészleteket kell a megfelelő fájlba másolni.
A leírás feltételezi az angol nyelv és a bash valamelyes ismeretét. A szkriptek 5-ös verziójú bash parancsértelmezőben lettek tesztelve.
Környezet
A bash nem tartalmaz parancsokat objektumok kezelésére, így vagy mindent objektumonként oldunk meg vagy megírjuk magunk a szükséges parancsokat. Az OOB az utóbbit valósítja meg, mégpedig úgy, hogy (egy kivétellel) a megírt utasítások csak a bash parancsértelmező belső függvényeit hívják meg.
A bash és az azt kiegészítő objektumkezelő parancsok együttese az Objektum Orientált Bash (angolul Object Oriented Bash), röviden OOB. A parancsokat függvényekben írjuk meg. A kísérleteink idejére a kiegészítő parancsok helye a $HOME/.local/lib/oob mappa. Innen tölthetjük be az OOB rendszerhez tartozó, később elkészítendő objektumokat is. Később ezt a mappát a megfelelő jogosultságokkal együtt áttehetjük az /usr/local/lib könyvtárba.
Az OOB könyvtárába létrehozzuk az alapvető parancsok tárolóját basic.oob néven:
#
# OOB internal
# basic.oob, version 0.0
# https://oob.xport.hu
# basic commands for Object Oriented BashEzek (a zöld színű) megjegyzéssorok a fájlról tartalmaznak alapvető információkat. Az első sor a # jeltől eltekintve üres, a második arról informál, hogy a fájl az (OOB) rendszerhez tartozik és milyen szerepkörben (internal). A harmadik a fájl nevét (basic.oob) és verziószámát (0.0) tartalmazza, a negyedik ennek az oldalnak az URL-je, az ötödik részletesebb információ.
Betöltés
Az objektumok kezeléséhez előbb be kell tölteni a memóriába az utasításkészletet, majd a felhasználói szkriptet. E két feladatot végzi el az OOB mappájában létrehozandó oob nevű fájl, amelyet végrehajthatóvá kell tegyünk:
#!/usr/bin/env bash # OOB internal # oob, version 0.1 # https://oob.xport.hu # loads Object Oriented Bash and executes user script t="$(realpath "$BASH_SOURCE")"; source "${t%/oob}/basic.oob" || exit # get OOB dir and load OOB t=$1; shift; [[ -n $t ]] && source "$t" "$@" # get script name and run user script
A fájl első sora most nem üres megjegyzéssor, hanem a shebang. Az operációs rendszer ebből tudja, hogy milyen héjat indítson el a szkript futtatásához. Ez a bash, amit az /usr/bin/env tölt be és biztosítja hozzá a megfelelő környezetet.
A program két programsorból áll. Az első programsor meghatározza az OOB mappájának abszolút útvonalát és betölti onnan a basic.oob fájlt. Ha ez sikertelen, akkor a program hibával kilép. A második programsorban a felhasználói szkript nevét azonosítjuk az első argumentummal és ha a név nem üres karakterlánc, akkor a többi argumentumot annak átadva futtatjuk is azt.
Az első programsorban használjuk a realpath nevű külső parancsot. (Az OOB rendszerben máshol nem használunk külső parancsot, mindent a bash belső utasításaival oldunk meg.) A parancs argumentuma a bash BASH_SOURCE tömbjének első eleme. (Egy tömb első elemére három alakban hivatkozhatunk: ${tömb[0]}, ${tömb}, $tömb.) A tömb az egymást hívó szkriptek sorát tartalmazza visszafelé, így az első eleme az aktuális szkript, azaz jelen esetben maga az oob fájlra mutató szimbolikus link. A realpath "$BASH_SOURCE" paranccsal ebből megkapjuk az oob fájl tényleges nevét, ebből meg a %/oob operátorral leválasztva a fájlnevet és így marad a mappa neve. (A % jelzi, hogy a változó végéről csonkolunk, a / a mappanév határoló.)
A realpath külső parancs használata elkerülhető, ha az OOB mappájának útvonalát közvetlenül írjuk be a szkriptbe.
Az oob fájlhoz a kísérleteink idejére egy szimbolikus linket készítünk a felhasználó saját parancsait tartalmazó mappába oob néven. Ez a mappa a $HOME/.local/bin vagy a $HOME/bin, attól függ, melyik Linux terjesztés melyik verzióját használjuk. Ha az OOB rendszert áttesszük az /usr/local/lib/oob mappa alá, akkor a linket az /usr/local/bin mappában hozzuk létre. A felhasználói parancsok mappája és az /usr/local/bin mappa is benne van a bash PATH változójában. Az oob parancs kiadásakor az operációs rendszer megtalálja az