OOB: Objektumok bash parancsértelmezőben

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 Bash

Ezek (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 oob szimbolikus linket. Ez a végrehajtható oob fájlhoz van kötve, így azt végre is hajtja.

1 2 3 4 5 6 7 8 9