Execline

A Unix/Linux szerverek üzemeltetése wikiből
(Változatok közti eltérés)
(Új oldal, tartalma: „= Az execline shell = == 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 Ubunt...”)
 
 
(egy szerkesztő 2 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 ==
   
13. sor: 11. sor:
 
''skalibs'' könyvtárra, ez szerencsére csomagból telepíthető:
 
''skalibs'' könyvtárra, ez szerencsére csomagból telepíthető:
   
{{{
 
 
# apt-get install skalibs-dev
 
# apt-get install skalibs-dev
}}}
 
   
 
A tarballt kicsomagolva tapasztalhatjuk, hogy az ''execline'' a kissé szokatlan
 
A tarballt kicsomagolva tapasztalhatjuk, hogy az ''execline'' a kissé szokatlan
22. sor: 18. sor:
   
 
A szokatlan könyvtárelrendezés miatt a fordításhoz néhány trükk szükséges,
 
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}}}
+
először is, az execline-x.yy.tar.gz-t csomagoljuk ki a <tt>$prefix/package</tt>
könyvtárba (ahol {{{$prefix}}} tetszőleges útvonal, célszerűen a saját /home
+
könyvtárba (ahol <tt>$prefix</tt> tetszőleges útvonal, célszerűen a saját /home
 
könyvtárunkban). Ezután:
 
könyvtárunkban). Ezután:
   
{{{
 
 
$ cd $prefix/package/admin/execline-x.yy/
 
$ cd $prefix/package/admin/execline-x.yy/
 
$ echo $prefix > conf-compile/conf-sp_root
 
$ 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
 
Ezzel beállítottuk a fordításhoz szükséges relatív útvonalat, ami egyébként
35. sor: 29. sor:
 
a skalibs include-fájlokat:
 
a skalibs include-fájlokat:
   
{{{
 
 
$ mkdir -p $prefix/package/prog/skalibs/
 
$ mkdir -p $prefix/package/prog/skalibs/
 
$ ln -s /usr/include/skalibs/ $prefix/package/prog/skalibs/include
 
$ ln -s /usr/include/skalibs/ $prefix/package/prog/skalibs/include
 
$ ln -s /usr/lib/skalibs/ $prefix/package/prog/skalibs/library
 
$ ln -s /usr/lib/skalibs/ $prefix/package/prog/skalibs/library
 
$ ln -s /usr/include/skalibs/sysdeps/ $prefix/package/prog/skalibs/sysdeps
 
$ 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
 
Ezek után a csomag remélhetőleg szerencsésen lefordítható az alábbi parancs
 
kiadásával:
 
kiadásával:
   
{{{
 
 
$ package/compile
 
$ package/compile
}}}
 
   
A keletkező binárisok a {{{command/}}} alkönyvtárban lesznek.
+
A keletkező binárisok a <tt>command/</tt> alkönyvtárban lesznek.
   
 
== Működési elv ==
 
== Működési elv ==
59. 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 program neve
** a parancssori agumentumok listájával: {{{argv}}}, ahol {{{argv[0]}}}
+
** mutató a környezetre (<tt>envp</tt>)
a program neve
+
* 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:
  +
$ nice -10 echo blah
  +
Így először a <tt>nice</tt> parancs fut le, ez értelmezi az első argumentumot,
  +
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.

[szerkesztés] 6 Példák

Személyes eszközök