Súgó
A súgó és az OOB betöltése
Ehhez saját függvényt írunk a basic.oob (verzió: 1.0.7) fájl végére:
oob_help() { local f t; [[ -f $1.$oob_LANG ]] && f="$1.$oob_LANG" || f="$1.en"; t="$(<"$f")"; printf %b "$t\n"; }A parancs először megkeresi a lokalizált súgófájlt úgy, hogy a súgófájl kiterjesztése jelzi a súgófájl nyelvét. Ha ilyen fájl nem létezik, akkor az angol nyelvú súgófájlt állítja be. Ezután a fájl tartalmát beolvassa egy helyi változóba, aminek a tartalmát kiírja. Az aktuális nyelv beállításához az oob_LANG változót kell beállítani, ezt mindjárt a basic.oob fájl elején megtesszük, így a fájl első két programsora így néz ki:
oob_HOME="${BASH_SOURCE%/*}" do=0 # define OOB home directory and descriptor of the root object
oob_LANG="${LANG:-${LANGUAGE:-${LC_ALL:-${LC_MESSAGES:-en}}}}" oob_LANG="${oob_LANG%%_*}" # set localized languageAz oob_LANG változó felveszi a LANG bash változó értékét, ám ha az üres vagy nem létezik, akkor sorban megpróbálja felvenni a LANGUAGE, LC_ALL, LC_MESSAGES változók közül az elsőt, amelyik rendelkezik értékkel. Ha egyik sem, akkor marad az en, az angol nyelvi beállítás. Végül a változó végéről eltávolítja az esetleges kódlap beállítást.
A súgó meghívásához hozzá kell igazítsuk a betöltőfájlt, ám mielőtt ezt megtesszük, a basic.oob fájl végére beírunk egy új parancsot:
oob() { # input: script, arguments # result: run script
[[ -z $1 ]] && return
oob_SOURCE=( "$1" "${oob_SOURCE[@]}" ); shift # add script name
source "$oob_SOURCE" "$@" || oob_trap "Error in" "$oob_SOURCE" # try execute the script
unset -v oob_SOURCE[0]; oob_SOURCE=( "${oob_SOURCE[@]}" ) # remove script name
} # oob()Ha a parancsot argumentum nélkül hívjuk meg, akkor azonnal visszatér, egyébként az első argumentumot végrehajtandó szkriptként értelmezi és megpróbálja futtatni úgy, hogy a többi argumentumot átadja annak. Sikertelenség esetén hibaágra fut. Az oob_SOURCE tömb a bash BASH_SOURCE tömbjéhez hasonlóan, az oob parancs által futtatott szkriptek útvonalát tartalmazza fordított sorrendben.
Ezzel el is készültünk a basic.oob fájllal, így véglegesíthetjük a verziószámozást, vagyis a köztes verziószámot megemeljük:
#
# OOB internal
# basic.oob, version 1.1.0
# https://oob.xport.hu
# basic commands for Object Oriented BashMost hozzáigazítjuk a súgó meghívásához az oob indítófájlt:
#!/usr/bin/env bash # OOB internal # oob, version 1.1.0 # https://oob.xport.hu # loads Object Oriented Bash and executes user script oob_SOURCE=( "$(realpath "$BASH_SOURCE")" ); source "${oob_SOURCE%/oob}/basic.oob" || exit # get OOB dir and load OOB case $1 in -h|--help) shift; oob_help "$oob_HOME/MSG/oob-help" "$@";; # load help for OOB *) oob "$@";; # run user script esac
Az oob fájl először létrehozza és inicializálja az oob_SOURCE tömböt a saját valódi elérési útvonalával. Ennek felhasználásával betölti a basic.oob fájlt. Ezután, ha az első argumentum (-h, --help) szerint a súgót kell betölteni, akkor meghívja az oob_help parancsot. Ha nem a súgó betöltése a cél, akkor a basic.oob fájlban az előbb létrehozott oob parancsot futtatja le.
A szkriptekben kiadott oob utasítások is már az oob parancsot fogják elindítani, nem az oob fájlt, így a szkriptek elérési útvonala bekerül az oob_SOURCE tömbbe.
Angol nyelvű súgó
A súgóba azokat a parancsokat írjuk be, amelyek a felhasználói interfész részei, a segédfüggvényeket nem. Írjuk meg az angol nyelű súgót az OOB mappájában az MSG almappába az oob-help.en fájlba:
\e[92;1mUsage \e[37moob\e[92;1m command:\e[0m oob --help this help page oob <script> <argument>... execute an user script #!/usr/bin/env oob using OOB in shebang \e[92;1mCommands in scripts for managing objects:\e[0m oob_ls [-dm] [<pattern>]... lists objects, attributes or methods oob_lss <pattern> returns array named oob_LSS with names of objects oob_anyObject <object>... returns with error if any object exists from arguments oob_allObjects <object>... returns with error if any object is missing from arguments oob_code [-odmc] <pattern>... outputs the code of objects, attributes, methods or classes oob_cp <new_object>=<pattern>... creates new objects (and roles) based on the pattern oob_cp <object>_=<pattern>... copies roles to the objects oob_rm <object>... deletes objects and their roles oob_clone <target object>=<object>... clones all attributes from object into target object \e[92;1mConstructor commands in scripts:\e[0m oob_new <objects> creates new objects from class-descriptors then create new ones oob_parents <pattern>... copies parent objects into the new class-descriptors oob_setTags -d|-m <name>=\x27<code>\x27... creates new attributes and methods in class-descriptors oob_rmTags -d|-m <name>... deletes attributes and methods from new descriptors oob_cpTags -d|-m <name>=<tag>... copies attributes and methods within class-descriptors oob_chgText <text> <pattern> [method]... replaces text in methods of class-descriptors oob_chgTag -d|-m <tag> <pattern> [method]... renames an attribute or a method in methods of class-descriptor \e[92;1mOOB library commands in scripts:\e[0m oob_export <library name> <version> <text> <pattern>... writes the file of OOB library oob_import <library name>... imports OOB libraries \e[92;1mOptions usable in commands:\e[0m -o objects -d attributes -m methods -c classes the options can be combined, eg: -odmc \e[92;1mPatterns for object handler commands for OOB:\e[0m o_<object> a single object o_<object>_@ the roles of the object o_<object>@ the object and its roles o_@ all object and roles o_<object>_+ the direct roles of the object o_<object>+ the object and its direct roles o_+ all top-level objects o_<pattern>- objects matching the pattern from the front o_<object>_- the direct roles of the object o_- all top-level objects \e[92;1mUsable variables in scripts:\e[0m oob_SOURCE array for executed scripts names oob_HOME home folder for OOB \e[92;1mUsable variables in methods:\e[0m self substitutes the current role name self_<attribute> substitutes the data member in the current role
Magyar nyelvű súgó
A magyar nyelű súgó az OOB mappájában az MSG almappában az oob-help.hu fájlban:
\e[92;1mAz \e[37moob\e[92;1m parancs használata:\e[0m oob --help ez a súgó oldal oob <szkript> <argumentum>... felhasználói szkript végrehajtása #!/usr/bin/env oob OOB használata shebang-ban \e[92;1mA szkriptekben használható objektumokat kezelő parancsok:\e[0m oob_ls [-dm] [<minta>]... listázza az objektumokat, az adattagokat vagy a metódusokat oob_lss <minta>... az oob_LSS tömbben visszaadja a megtalált objektumneveket oob_anyObject <objektum>... hibával tér vissza, ha valamelyik objektum létezik oob_allObjects <objektum>... hibával tér vissza, ha bármelyik objktum nem létezik oob_code [-odmc] <minta>... kiírja az objektumok, az adattagok, a metódusok vagy az osztályok kódját oob_cp <új objektum>=<minta>... új objektumokat (és szerepeket) hoz létre a minta alapján oob_cp <objektum>_=<minta>... szerepeket másol az objektumhoz oob_rm <objektum>... objektumokat és a szerepeiket törli oob_clone <cél objektum>=<objektum>... az összes adattagot bemásolja az objektumból a cél objektumba \e[92;1mA szkriptekben használható Konstruktor parancsok:\e[0m oob_new <objektum>... új objektumokat hoz létre a leírókból, utána újakat hoz létre oob_parents <minta>... a szülőobjektumokat bemásolja a leírókba oob_setTags -d|-m <név>=\x27<kód>\x27... új adattagokat és metódusokat hoz létre a leírókban oob_rmTags -d|-m <név>... adattagokat és metódusokat töröl a leírókból oob_cpTags -d|-m <név>=<tag>... adattagokat és metódusokat másol a leírókban oob_chgText <szöveg> <minta> [metódus]... szöveget cserél a metódus leíróban oob_chgTag -d|-m <tag> <minta> [metódus]... egy adattag vagy egy metódus nevét cseréli a metódus leíróban \e[92;1mA szkriptekben hssználható OOB könyvtár parancsok:\e[0m oob_export <könyvtár neve> <verzió> <szöveg> <szűrő>... fájlba írja az OOB osztálykönyvtárat oob_import <könyvtár neve>... beolvassa az OOB osztálykönyvtárakat \e[92;1mA parancsokban használható opciók:\e[0m -o objektum -d adattag -m metódus -c osztály az opciók kombinálhatóak, például: -odmc \e[92;1mAz objektumkezelő parancsokban használható minták:\e[0m o_<objektum> egy objektum o_<objektum>_@ az objektum szerepei o_<objektum>@ az objektum és szerepei o_@ minden objektum és szerep o_<objektum>_+ az objektum közvetlen szerepei o_<objektum>+ az objektum és közvetlen szerepei o_+ minden felső szintű objektum o_<minta>- a mintára előlről illeszkedő objektumok o_<objektum>_- az objektum közvetlen szerepei o_- minden felső szintű objektum \e[92;1mA stkriptekben használható változók:\e[0m oob_SOURCE a végrehajtott szkriptek tömbje oob_HOME az OOB saját könyvtára \e[92;1mA metódusokban használható változók:\e[0m self az aktuális szerep nevét helyettesíti self_<adattag> az adattagot helyettesíti az aktuális szerepben
Az elkészült rendszer használatba vétele
Pezsgőt bonthatunk, elkészítettük az OOB rendszer használható verzióját. Ha van hozzáférésünk, akkor az oob, basic.oob, oob-help.sh fájlokat bemásolhatjuk az /usr/local/lib/oob könyvtárba. Az oob fájlhoz adjunk mindenkinek futtatási jogot és készítsünk szimbolikus linket hozzá az /usr/local/bin fájlba. Az angol és magyar súgófájlokat másoljuk be az /usr/local/lib/oob/MSG könyvtárba. Ezzel beillesztettük az OOB bash kiegészítést a számítógép rendszerébe.
Ha nincs hozzáférésünk a fenti könyvtárakhoz, akkor saját használatra igénybe vehetjük a $HOME/.local/lib/oob könyvtárat, a szimbolikus linkhez meg a $HOME/.local/bin vagy a $HOME/bin könyvtárat.
Az OOB rendszerben a szkriptekre jellemzően minden publikus. Ugyan lehetne privát adattagokat és metódusokat készíteni, azonban ez bonyolítaná és lassítaná a rendszert, ezért tudatosan elhagytuk ennek kidolgozását. Amúgy sem lehetne teljesen elrejteni a komponenseket, csak megnehezíteni tudnánk a lekérdezésüket.
A tanuláshoz és a használathoz sok sikert kíván a szerző: Kochis Pál Zoltán (pal@kochis.hu)