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.