Execline
(egy szerkesztő egy közbeeső változata nincs mutatva) | |||
1. sor: | 1. sor: | ||
− | = Az execline shell = |
||
− | |||
== Fordítás/telepítés == |
== Fordítás/telepítés == |
||
51. sor: | 49. sor: | ||
sok program használ. Ennek lényege a következő: |
sok program használ. Ennek lényege a következő: |
||
− | * a UNIX-os programok indítása az execve() rendszerhívással történik, amelyet |
+ | * a UNIX-os programok indítása az execve() rendszerhívással történik, amelyet három argumentummal kell meghívni: |
− | három argumentummal kell meghívni: |
||
** a program nevével (redundáns) |
** a program nevével (redundáns) |
||
− | ** a parancssori agumentumok listájával: <tt>argv</tt>, ahol <tt>argv[0]</tt> |
+ | ** a parancssori agumentumok listájával: <tt>argv</tt>, ahol <tt>argv[0]</tt> a program neve |
− | a program neve |
||
** mutató a környezetre (<tt>envp</tt>) |
** mutató a környezetre (<tt>envp</tt>) |
||
− | + | * az <tt>argv</tt> lista lehetővé teszi, hogy a lista elejéről olvasva végrehajtsunk egy parancsot, majd a lista maradékát tovább <tt>exec</tt>-eljük. |
|
− | * az <tt>argv</tt> lista lehetővé teszi, hogy a lista elejéről olvasva |
||
− | végrehajtsunk egy parancsot, majd a lista maradékát tovább <tt>exec</tt>-eljük. |
||
Több program is működik ezen az elven, például: |
Több program is működik ezen az elven, például: |
||
$ nice -10 echo blah |
$ nice -10 echo blah |
||
Így először a <tt>nice</tt> parancs fut le, ez értelmezi az első argumentumot, |
Így először a <tt>nice</tt> parancs fut le, ez értelmezi az első argumentumot, |
||
− | ami a -10, majd végrehajtja az <tt>echo</tt> parancsot. |
+ | ami a -10, majd exec-eli az <tt>echo</tt> parancsot, az echo parancs aztán |
+ | feldolgozza a <tt>blah</tt> argumentumot. |
||
+ | |||
+ | Ez a működés a vezérlési szerkezeteket megvalósító ''vezérlőprogramok'' |
||
+ | közbeiktatásával alkalmas egy teljes programozási nyelv megvalósítására. Ezen |
||
+ | az alapon működik az ''execline''. Egy ''execline'' szkript tehát egyetlen |
||
+ | hosszú <tt>argv</tt> tömb, amelyben speciális parancsok valósítják |
||
+ | meg a ciklusokat, elágazásokat, váltózókezelést, stb. |
||
+ | |||
+ | == Vezérlőprogramok == |
||
+ | |||
+ | == Változók kezelése == |
||
+ | |||
+ | Változók definiálására szintén önálló programok állnak rendelkezésre, ezek a: |
||
+ | |||
+ | * define |
||
+ | * import |
||
+ | * importas |
||
+ | * backtick |
||
+ | * elglob |
||
+ | * elgepositionals |
||
+ | * multisubstitute |
||
+ | * for |
||
+ | * forbacktick |
||
+ | |||
+ | A változónevek $, }, { karaktereken kívül bármilyen karaktert tartalmazhatnak, |
||
+ | de természetesen célszerű alfanumerikus karaktereket használni a változók |
||
+ | megnevezésére. |
||
+ | A definiált változókra történő hivatkozás hasonló a hagyományos shelleknél |
||
+ | megszokottakhoz, például: |
||
+ | |||
+ | define foo blah |
||
+ | echo "foo is:" $foo "or:" ${foo} |
||
+ | |||
+ | kimenete a következő lesz: |
||
+ | |||
+ | foo is: blah or: blah |
||
+ | |||
+ | Ezek a helyettesítések a <tt>define</tt>-t követően bárhol érvényesek, |
||
+ | nincs tehát olyan, mint a bash-nél, hogy különböző idézőjelekben különbözőképpen |
||
+ | értelmeződnek a változó-behelyettesítések. Ha literális <tt>$foo</tt>-t |
||
+ | vagy <tt>${foo}</tt>-t szeretnénk, akkor backslash-sel (\) oldhatjuk |
||
+ | fel a $, {, } speciális jelentését (ha backslash-t szeretnénk írni, |
||
+ | természetesen dupla \\-t kell használnunk). A trükk az, hogy |
||
+ | az ''execline'' és ''execlineb'' parancsok a backslash-t maguk is |
||
+ | escape-karakterként értelmezik, tehát minden backslash-t meg kell dupláznunk: |
||
+ | |||
+ | define foo blah |
||
+ | echo "literal foo is:" \\$foo "or:" \\${foo} "two backslashes:" \\\\ |
||
+ | |||
+ | ennek kimenete: |
||
+ | literal foo is: $foo or: ${foo} two backslashes: \\ |
||
+ | |||
+ | == Execlineb és execline == |
||
+ | |||
+ | A programcsomag két futtatóprogramot is tartalmaz az execline szkriptek |
||
+ | végrehajtására. Ezek közül az ''execlineb'' szolgál a felhasználói szkriptek |
||
+ | írására, ez némi szintaktikai támogatást nyújt. A másik, ''execline'' nevű |
||
+ | nagyon egyszerű szintaktika mellett az alacsony szintű működést biztosítja. |
||
+ | |||
+ | Miután az ''execlineb'' a bemenet szintaktikai feldolgozását elvégezte, |
||
+ | átadja az eredményt az ''execline''-nak amely a tényleges futtatásért |
||
+ | felelős, az ''execlineb'' tehát csak egy wrapper, előfeldolgozó szerepét |
||
+ | tölti be. |
||
+ | |||
+ | == Példák == |
A lap jelenlegi, 2009. január 19., 20:53-kori változata
Tartalomjegyzék |
[szerkesztés] 1 Fordítás/telepítés
Az execline-t Ubuntu 8.10-en próbáltam ki. Sajnos csomag formájában nem található meg a Debian és Ubuntu disztribúciókban, ezért forrásból kell telepíteni.
A tarball letölthető a http://www.skarnet.org/software/execline/install.html címről, ugyanitt részletes telepítési utasítás is található, mivel azonban a szokásos make/make install lépéseknél többre van szükség, ezért a fordítás menetét kicsit részletezem. Szükség lesz a skalibs könyvtárra, ez szerencsére csomagból telepíthető:
# apt-get install skalibs-dev
A tarballt kicsomagolva tapasztalhatjuk, hogy az execline a kissé szokatlan slashpackage konvenciót alkalmazza, a programot egyébként a 4 pontos BSD licensszel terjesztik.
A szokatlan könyvtárelrendezés miatt a fordításhoz néhány trükk szükséges, először is, az execline-x.yy.tar.gz-t csomagoljuk ki a $prefix/package könyvtárba (ahol $prefix tetszőleges útvonal, célszerűen a saját /home könyvtárunkban). Ezután:
$ cd $prefix/package/admin/execline-x.yy/ $ echo $prefix > conf-compile/conf-sp_root
Ezzel beállítottuk a fordításhoz szükséges relatív útvonalat, ami egyébként a gyökérkönyvtárra mutatott volna. Ezután azért, hogy a fordító megtalálja a skalibs include-fájlokat:
$ mkdir -p $prefix/package/prog/skalibs/ $ ln -s /usr/include/skalibs/ $prefix/package/prog/skalibs/include $ ln -s /usr/lib/skalibs/ $prefix/package/prog/skalibs/library $ ln -s /usr/include/skalibs/sysdeps/ $prefix/package/prog/skalibs/sysdeps
Ezek után a csomag remélhetőleg szerencsésen lefordítható az alábbi parancs kiadásával:
$ package/compile
A keletkező binárisok a command/ alkönyvtárban lesznek.
[szerkesztés] 2 Működési elv
A nyelv alapja az úgynevezett láncolt betöltés (chain loading), amit Bernstein-láncolásnak ([http://www.faqs.org/docs/artu/ch07s02.html Bernstein chaining]) is neveznek, egy alapvető UNIX-os technika, amit sok program használ. Ennek lényege a következő:
- a UNIX-os programok indítása az execve() rendszerhívással történik, amelyet három argumentummal kell meghívni:
- a program nevével (redundáns)
- a parancssori agumentumok listájával: argv, ahol argv[0] a program neve
- mutató a környezetre (envp)
- az argv lista lehetővé teszi, hogy a lista elejéről olvasva végrehajtsunk egy parancsot, majd a lista maradékát tovább exec-eljük.
Több program is működik ezen az elven, például:
$ nice -10 echo blah
Így először a nice parancs fut le, ez értelmezi az első argumentumot, ami a -10, majd exec-eli az echo parancsot, az echo parancs aztán feldolgozza a blah argumentumot.
Ez a működés a vezérlési szerkezeteket megvalósító vezérlőprogramok közbeiktatásával alkalmas egy teljes programozási nyelv megvalósítására. Ezen az alapon működik az execline. Egy execline szkript tehát egyetlen hosszú argv tömb, amelyben speciális parancsok valósítják meg a ciklusokat, elágazásokat, váltózókezelést, stb.
[szerkesztés] 3 Vezérlőprogramok
[szerkesztés] 4 Változók kezelése
Változók definiálására szintén önálló programok állnak rendelkezésre, ezek a:
- define
- import
- importas
- backtick
- elglob
- elgepositionals
- multisubstitute
- for
- forbacktick
A változónevek $, }, { karaktereken kívül bármilyen karaktert tartalmazhatnak, de természetesen célszerű alfanumerikus karaktereket használni a változók megnevezésére. A definiált változókra történő hivatkozás hasonló a hagyományos shelleknél megszokottakhoz, például:
define foo blah echo "foo is:" $foo "or:" ${foo}
kimenete a következő lesz:
foo is: blah or: blah
Ezek a helyettesítések a define-t követően bárhol érvényesek, nincs tehát olyan, mint a bash-nél, hogy különböző idézőjelekben különbözőképpen értelmeződnek a változó-behelyettesítések. Ha literális $foo-t vagy ${foo}-t szeretnénk, akkor backslash-sel (\) oldhatjuk fel a $, {, } speciális jelentését (ha backslash-t szeretnénk írni, természetesen dupla \\-t kell használnunk). A trükk az, hogy az execline és execlineb parancsok a backslash-t maguk is escape-karakterként értelmezik, tehát minden backslash-t meg kell dupláznunk:
define foo blah echo "literal foo is:" \\$foo "or:" \\${foo} "two backslashes:" \\\\
ennek kimenete:
literal foo is: $foo or: ${foo} two backslashes: \\
[szerkesztés] 5 Execlineb és execline
A programcsomag két futtatóprogramot is tartalmaz az execline szkriptek végrehajtására. Ezek közül az execlineb szolgál a felhasználói szkriptek írására, ez némi szintaktikai támogatást nyújt. A másik, execline nevű nagyon egyszerű szintaktika mellett az alacsony szintű működést biztosítja.
Miután az execlineb a bemenet szintaktikai feldolgozását elvégezte, átadja az eredményt az execline-nak amely a tényleges futtatásért felelős, az execlineb tehát csak egy wrapper, előfeldolgozó szerepét tölti be.