Marcel - Një predhë më moderne për Linux
Marseli është një guaskë e re. Është e ngjashme me predha tradicionale në shumë mënyra, por bën disa gjëra ndryshe:
- Tubacionet: Të gjitha predha përdorin tuba për të dërguar një tekst nga dalja e një komande në hyrjen e një tjetre. Marcel tuba strukturoi të dhëna në vend të vargjeve.
- Python: Marcel zbatohet në Python dhe ekspozon Python në një sërë mënyrash. Nëse keni nevojë për pak logjikë në komandat tuaja, marcel ju lejon ta shprehni atë në Python.
- Scripting: Marcel ka një qasje të pazakontë ndaj shkrimit. Sigurisht, thjesht mund të shkruani një sekuencë komandash marcel në një skedar teksti dhe t'i ekzekutoni ato. Por Marcel gjithashtu ofron një API në formën e një moduli Python. Ju mund ta importoni këtë modul për të bërë skriptimin në Python në një mënyrë shumë më të përshtatshme sesa është e mundur me Python të thjeshtë.
Marcel është i licencuar sipas GPLv3.
Instalimi i Marcel Modern Shell në Linux
Marcel kërkon Python 3.6 ose më vonë. Është zhvilluar dhe testuar në Linux, dhe kryesisht funksionon në macOS. (Nëse dëshironi të ndihmoni të transferoni në Windows ose të rregulloni mangësitë e macOS, kontaktoni.)
Për të instaluar marcel për përdorimin tuaj:
# python3 -m pip install marcel
Ose nëse dëshironi të instaloni për të gjithë përdoruesit (p.sh., në /usr/local
):
$ sudo python3 -m pip install --prefix /usr/local marcel
Pasi të keni instaluar marcel, kontrolloni që po funksionon duke ekzekutuar komandën marcel dhe më pas në kërkesën marcel, ekzekutoni komandën e versionit:
$ marcel
Personalizimi i Marcel Shell
Ju mund ta personalizoni marcelin në skedarin ~/.marcel.py
, i cili lexohet në fillim, (dhe rilexohet kur modifikohet). Siç mund ta dalloni nga emri i skedarit, personalizimi i marcel bëhet në Python.
Një gjë që ndoshta dëshironi të bëni është të personalizoni kërkesën. Për ta bërë këtë, ju caktoni një listë për ndryshoren PROMPT. Për shembull, nëse dëshironi që kërkesa juaj të jetë direktoria aktuale, e printuar në të gjelbër, e ndjekur nga >
e printuar në blu:
PROMPT = [
Color(0, 4, 0),
lambda: PWD,
Color(0, 2, 5),
'> '
]
Kërkesa që rezulton duket si kjo:
Kjo zëvendëson konfigurimin e padepërtueshëm PS1
që do t'ju duhet të bëni në bash. Color (0, 4, 0) specifikon jeshile, (argumentet janë vlera RGB, në intervalin 0-5). PWD është ndryshorja e mjedisit që përfaqëson direktorinë tuaj aktuale dhe duke e prefiksuar këtë variabël me lambda:
gjeneron një funksion, i vlerësuar sa herë që shfaqet kërkesa.
~/.marcel.py
gjithashtu mund të importojë module Python. P.sh., nëse dëshironi të përdorni funksionet e modulit të matematikës në komandat tuaja marcel:
from math import *
Pasi ta keni bërë këtë, mund t'i referoheni simboleve nga ai modul, p.sh. pi
:
Vini re se pi
është vendosur në kllapa. Në përgjithësi, marcel përdor kllapa për të kufizuar shprehjet e Python. Pra, (pi)
vlerëson shprehjen Python që merr vlerën e ndryshores pi. Ju gjithashtu mund të përdorni variablat tradicionale të mjedisit në këtë mënyrë, p.sh. (USER) dhe (HOME), ose ndonjë shprehje e vlefshme Python që mbështetet në simbolet në hapësirën e emrave të Marcel.
Dhe ju, sigurisht, mund të përcaktoni simbolet tuaja. Për shembull, nëse vendosni këtë përkufizim funksioni në ~/.marcel.py
:
def factorial(n):
f = 1
for i in range(1, n + 1):
f *= i
return f
atëherë mund të përdorni funksionin faktorial në vijën komanduese, p.sh.
Shembuj të Marcel Shell
Këtu do të mësojmë disa shembuj të komandave në guaskën marcel.
Eksploroni drejtorinë aktuale në mënyrë rekursive, gruponi skedarët sipas shtrirjes së tyre (p.sh. .txt
, .py
e kështu me radhë) dhe llogaritni madhësinë totale të skedarit për secilin grup.
Ju mund ta bëni këtë në marcel si më poshtë:
Operatori ls prodhon një rrymë objektesh File, (-fr
do të thotë vizitoni drejtoritë në mënyrë rekursive dhe ktheni vetëm skedarë).
Objektet File dërgohen në komandën tjetër, hartën. Harta specifikon një funksion Python, në kllapat më të jashtme, i cili harton çdo skedar në një tufë që përmban zgjerimin e skedarit dhe madhësinë e tij. (Marcel lejon që fjala kyçe lambda të hiqet.)
Operatori i kuq (zvogëlimi), grupon sipas pjesës së parë të tuples (zgjerim) dhe më pas përmbledh madhësitë brenda secilit grup. Rezultati është renditur sipas shtrirjes.
Tubacionet mund të përmbajnë një përzierje të operatorëve marcel dhe ekzekutivëve pritës. Objektet e tubave të operatorëve, por në kufijtë e operatorit/të ekzekutueshëm, në vend të kësaj, vargjet e tubave marcel.
Për shembull, kjo komandë kombinon operatorët dhe ekzekutuesit dhe liston emrat e përdoruesve, guaska e të cilëve është /bin/bash
.
$ cat /etc/passwd \
| map (line: line.split(':')) \
| select (*line: line[-1] == '/bin/bash') \
| map (*line: line[0]) \
| xargs echo
cat është një Linux i ekzekutueshëm. Ai lexon /etc/passwd dhe marcel përcjell përmbajtjen e tij në drejtim të hartës së operatorit marcel.
Argumenti i vendosur në kllapa për hartën është një funksion Python që ndan linjat në ndarësit :
, duke dhënë 7-tupa. Një përzgjedhje është një operator marcel, argumenti i të cilit është një funksion Python që identifikon ato tuple në të cilat fusha e fundit është /bin/bash.
Operatori tjetër, një hartë tjetër ruan fushën e emrit të përdoruesit të çdo tupleje hyrëse. Së fundi, xargs echo kombinon emrat e përdoruesve në hyrje në një rresht të vetëm, i cili printohet në stdout.
Shkrimi në Marcel Shell
Ndërsa Python ndonjëherë konsiderohet të jetë një gjuhë skriptimi, në të vërtetë nuk funksionon mirë për këtë qëllim. Problemi është se ekzekutimi i komandave të guaskës dhe ekzekutuesve të tjerë nga Python është i rëndë. Ju mund të përdorni os.system()
, i cili është i thjeshtë por shpesh i papërshtatshëm për t'u marrë me stdin, stdout dhe stderr. nënprocesi.Popen()
është më i fuqishëm, por më kompleks për t'u përdorur.
Qasja e Marcel është të sigurojë një modul që integron operatorët marcel me veçoritë gjuhësore të Python. Për të rishikuar një shembull të mëparshëm, këtu është kodi Python për llogaritjen e shumës së madhësive të skedarëve sipas zgjerimit:
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})
Komandat e guaskës janë të njëjta si më parë, me përjashtim të konventave sintaksore. Pra, ls -fr
kthehet në ls(file=True, rekursive=True). Harta dhe operatorët e kuq janë gjithashtu aty, të lidhur me tuba, si në versionin e guaskës. E gjithë komanda e guaskës (ls … e kuqe) jep një përsëritës Python në mënyrë që komanda të mund të përdoret me Python për një lak.
Qasja në bazën e të dhënave me Marcel Shell
Ju mund të integroni aksesin në bazën e të dhënave me tubacionet marcel. Së pari, duhet të konfiguroni aksesin në bazën e të dhënave në skedarin e konfigurimit, ~/.marcel.py
, p.sh.
define_db(name='jao',
driver='psycopg2',
dbname='acme',
user='jao')
DB_DEFAULT = 'jao'
Kjo konfiguron aksesin në një bazë të dhënash Postgres të quajtur acme, duke përdorur drejtuesin psycopg2. Lidhjet nga marcel do të bëhen duke përdorur përdoruesin jao, dhe profili i bazës së të dhënave quhet jao. (DB_DEFAULT specifikon profilin e bazës së të dhënave jao si atë që do të përdoret nëse nuk specifikohet asnjë profil.) Me këtë konfigurim të kryer, databaza tani mund të kërkohet duke përdorur operatorin sql, p.sh.
sql 'select part_name, quantity from part where quantity < 10' \
| out --csv –-file ~/reorder.csv
Kjo komandë kërkon një tabelë me emrin pjesë dhe e hedh rezultatin e pyetjes në skedarin ~/reorder.csv
, në formatin CSV.
Qasje në distancë me Marcel Shell
Ngjashëm me aksesin në bazën e të dhënave, qasja në distancë mund të konfigurohet në ~/.marcel.py
. Për shembull, kjo konfiguron një grup me 4 nyje:
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'])
Grupi mund të identifikohet si një laborator në komandat marcel. Parametrat e përdoruesit dhe identitetit specifikojnë informacionin e hyrjes, dhe parametri pritës specifikon adresat IP të nyjeve në grup.
Pasi të konfigurohet grupi, të gjitha nyjet mund të operohen menjëherë. Për shembull, për të marrë një listë të pideve të procesit dhe linjave të komandës në të gjithë grupin:
@lab [ps | map (proc: (proc.pid, proc.commandline))]
Kjo kthen një rrjedhë tuplesh (adresa IP, PID, linja komanduese).
Për më shumë informacion vizitoni:
- https://www.marceltheshell.org/
- https://github.com/geophile/marcel
Marcel është mjaft i ri dhe në zhvillim aktiv. Kontaktoni nëse dëshironi të ndihmoni.