Weboldal keresés

Marcel – Egy modernebb Shell Linuxhoz


A Marcel egy új rendszerhéj. Sok tekintetben hasonlít a hagyományos héjakhoz, de néhány dolgot másképp csinál:

  • Csővezetékek: Minden parancsértelmező csöveket használ arra, hogy szöveget küldjön az egyik parancs kimenetéből egy másik parancs bemenetére. Marcel strukturált adatokat vezet be karakterláncok helyett.
  • Python: A Marcel a Pythonban van implementálva, és számos módon hozzáférhetővé teszi a Pythont. Ha szüksége van egy kis logikára a parancsokban, a marcel lehetővé teszi, hogy Pythonban fejezze ki.
  • Szkriptírás: Marcel szokatlan módon közelíti meg a szkripteket. Természetesen egyszerűen beírhat egy marcel parancssorozatot egy szövegfájlba, és végrehajthatja azokat. De Marcel is biztosít egy API-t Python modul formájában. Importálhatja ezt a modult, hogy a Python-szkriptet sokkal kényelmesebb módon végezze el, mint a sima Python.

A Marcel a GPLv3 licenccel rendelkezik.

A Marcel Modern Shell telepítése Linuxra

Marcelnek Python 3.6 vagy újabb verzióra van szüksége. Linuxon fejlesztették és tesztelték, és többnyire macOS rendszeren működik. (Ha segíteni szeretne a Windows rendszerre történő portolásban, vagy kijavítani a macOS hiányosságokat, vegye fel a kapcsolatot.)

A marcel telepítéséhez saját használatra:

python3 -m pip install marcel

Vagy ha az összes felhasználó számára szeretné telepíteni (pl. a /usr/local címre):

sudo python3 -m pip install --prefix /usr/local marcel

A marcel telepítése után ellenőrizze, hogy működik-e a marcel parancs futtatásával, majd a marcel parancssornál futtassa a verziót. parancs:

marcel

Marcel Shell testreszabása

Testreszabhatja a marcel elemet a ~/.marcel.py fájlban, amely indításkor beolvassa (és módosításkor újraolvassa). Amint a fájl nevéből kiderül, a marcel testreszabása Pythonban történik.

Az egyik dolog, amit valószínűleg meg szeretne tenni, az az üzenet testreszabása. Ehhez hozzárendel egy listát a PROMPT változóhoz. Például, ha azt szeretné, hogy a prompt az aktuális könyvtár legyen, zölddel, majd ezt követi a kékkel nyomtatott >:

PROMPT = [
    Color(0, 4, 0),
    lambda: PWD,
    Color(0, 2, 5),
    '> '
]

Az eredményül kapott prompt így néz ki:

Ez felváltja a kifürkészhetetlen PS1 konfigurációt, amelyet a bash-ban kell elvégeznie. A Color(0, 4, 0) a green értéket adja meg (az argumentumok RGB értékek, a 0-5 tartományban ). A PWD az a környezeti változó, amely az aktuális könyvtárat képviseli, és ennek a változónak a lambda: előtagjaként egy függvényt generál, amelyet a prompt minden egyes megjelenésekor kiértékel.

A ~/.marcel.py Python modulokat is képes importálni. Például, ha a matematikai modul funkcióit szeretné használni a marcel parancsaiban:

from math import *

Ha ezt megtette, hivatkozhat az adott modul szimbólumaira, pl. pi:

Vegye figyelembe, hogy a pi zárójelben van. Általában a marcel zárójeleket használ a Python-kifejezések elválasztására. Tehát a (pi) kiértékeli a Python-kifejezést, amely lekéri a pi változó értékét. A hagyományos környezeti változókat is így érheti el, pl. (USER) és (HOME), vagy bármely érvényes Python-kifejezés, amely a marcel névterében lévő szimbólumokra támaszkodik.

És természetesen meghatározhatja a saját szimbólumait. Például, ha ezt a függvénydefiníciót a ~/.marcel.py fájlba helyezi:

def factorial(n):
    f = 1
    for i in range(1, n + 1):
        f *= i
    return f

akkor használhatod a parancssorban a faktoriális függvényt, pl.

Marcel Shell Példák

Itt megtudunk néhány példát a marcel shell parancsaira.

Keresse meg a fájlméreteket kiterjesztés szerint

Fedezze fel rekurzívan az aktuális könyvtárat, csoportosítsa a fájlokat kiterjesztésük szerint (pl. .txt, .py és így tovább), és számítsa ki az egyes csoportok teljes fájlméretét.

Ezt a következőképpen teheti meg a marcelban:

Az ls operátor fájl objektumok folyamát állítja elő (a -fr azt jelenti, hogy rekurzívan látogatja meg a könyvtárakat, és csak fájlokat ad vissza).

A Fájl objektumok a következő parancshoz, a térképhez kerülnek. A map egy Python-függvényt határoz meg a legkülső zárójelben, amely minden fájlt leképez a fájl kiterjesztését és méretét tartalmazó sorra. (Marcel megengedi a lambda kulcsszó elhagyását.)

A piros (kicsinyítés) operátor a sor első része (kiterjesztés) szerint csoportosít, majd összegzi az egyes csoportokon belüli méreteket. Az eredmény kiterjesztés szerint van rendezve.

Host Executables és a Marcel Pipeline

A folyamatok tartalmazhatnak marcel operátorok és gazdagép végrehajtható fájlok keverékét. Az operátorok objektumokat vezetnek be, de az operátor/végrehajtható határokon a marcel karakterláncokat vezet be.

Ez a parancs például egyesíti az operátorokat és a végrehajtható fájlokat, és felsorolja azon felhasználók felhasználónevét, akiknek shellje /bin/bash.

cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo

A cat egy Linux futtatható fájl. Beolvassa az /etc/passwd fájlt, és a marcel a tartalmát lefelé továbbítja a marcel operátortérképhez.

A leképezéshez a zárójeles argumentum egy Python-függvény, amely felosztja a sorokat a : elválasztóknál, és 7 sorokat eredményez. A select egy marcel operátor, amelynek argumentuma egy Python-függvény, amely azonosítja azokat a sorokat, amelyekben az utolsó mező a /bin/bash.

A következő operátor, egy másik leképezés megtartja az egyes bemeneti sorok felhasználónév mezőjét. Végül az xargs echo egyetlen sorban egyesíti a bejövő felhasználóneveket, amelyet a rendszer az stdout-ba nyomtat.

Szkriptírás Marcel Shellben

Noha a Python-ot néha szkriptnyelvnek tekintik, valójában nem működik jól erre a célra. A probléma az, hogy a shell-parancsok és más végrehajtható fájlok futtatása Pythonból nehézkes. Használhatja az os.system() fájlt, amely egyszerű, de gyakran nem megfelelő az stdin, stdout és stderr kezelésére. A subprocess.Popen() erősebb, de bonyolultabb a használata.

Marcel megközelítése egy olyan modul létrehozása, amely integrálja a marcel operátorokat a Python nyelvi szolgáltatásaival. Egy korábbi példa újragondolásához itt van a Python-kód a fájlméretek összegének kiterjesztés szerinti kiszámításához:

from marcel.api import *

for ext, size in (ls(file=True, recursive=True)
                  | map(lambda f: (f.suffix, f.size))
                  | red('.', '+')):
    print(f'{ext}: {size})

A shell parancsok ugyanazok, mint korábban, kivéve a szintaktikai konvenciókat. Tehát az ls -fr ls(file=True, recursive=True)-re változik. A térkép és a piros operátorok is ott vannak, csövekkel összekötve, mint a shell verzióban. A teljes shell-parancs (ls … red) egy Python-iterátort ad, így a parancs a Python-szal együtt használható ciklushoz.

Adatbázis-hozzáférés Marcel Shell segítségével

Integrálhatja az adatbázis-hozzáférést a marcel folyamatokkal. Először is be kell állítania az adatbázis-hozzáférést a ~/.marcel.py konfigurációs fájlban, pl.

define_db(name='jao',
          driver='psycopg2',
          dbname='acme',
          user='jao')

DB_DEFAULT = 'jao'

Ezzel konfigurálja a hozzáférést az acme nevű Postgres adatbázishoz a psycopg2 illesztőprogram használatával. A marcel kapcsolatai a jao felhasználó használatával jönnek létre, és az adatbázisprofil neve jao. (A DB_DEFAULT a jao adatbázis-profilt határozza meg, mint azt, amelyet használni kell, ha nincs profil megadva.) Ha ezt a konfigurációt elvégezte, az adatbázis lekérdezhető az sql operátor használatával, pl.

sql 'select part_name, quantity from part where quantity < 10' \
| out --csv –-file ~/reorder.csv

Ez a parancs lekérdez egy part nevű táblát, és a lekérdezés eredményét a ~/reorder.csv fájlba írja CSV formátumban.

Távoli hozzáférés Marcel Shell segítségével

Az adatbázis-hozzáféréshez hasonlóan a távoli hozzáférést is be lehet állítani a ~/.marcel.py fájlban. Például ez konfigurál egy 4 csomópontos klasztert:

define_remote(name='lab',
              user='frankenstein',
              identity='/home/frankenstein/.ssh/id_rsa',
              host=['10.0.0.100', 
                    '10.0.0.101',
                    '10.0.0.102',
                    '10.0.0.103'])

A fürt laboratóriumként azonosítható a marcel parancsokban. A felhasználói és identitási paraméterek megadják a bejelentkezési információkat, a host paraméter pedig a fürt csomópontjainak IP-címét.

A fürt konfigurálása után az összes csomópont egyszerre üzemeltethető. Például a fürtben lévő pids folyamatok és parancssorok listájának megtekintéséhez:

@lab [ps | map (proc: (proc.pid, proc.commandline))]

Ez (IP-cím, PID, parancssori) sorok folyamát adja vissza.

További információért látogasson el:

  • https://www.marceltheshell.org/
  • https://github.com/geophile/marcel

A Marcel meglehetősen új és aktív fejlesztés alatt áll. Vedd fel a kapcsolatot, ha szeretnél segíteni.