Marcel - Nútímalegri skel fyrir Linux


Marcel er ný skel. Það er svipað hefðbundnum skeljum á margan hátt, en það gerir nokkra hluti öðruvísi:

  • Pípulagnir: Allar skeljar nota pípur til að senda texta frá úttaki einnar skipunar til inntaks annarrar. Marcel pípur skipulögð gögn í stað strengja.
  • Python: Marcel er útfært í Python og afhjúpar Python á ýmsa vegu. Ef þú þarft smá rökfræði í skipunum þínum, þá leyfir marcel þér að tjá það í Python.
  • Handskrift: Marcel tekur óvenjulega nálgun á handrit. Þú getur auðvitað einfaldlega skrifað röð af marcel skipunum í textaskrá og framkvæmt þær. En Marcel býður einnig upp á API í formi Python mát. Þú getur flutt þessa einingu inn til að gera Python forskriftir á mun þægilegri hátt en hægt er með venjulegum Python.

Marcel er með leyfi samkvæmt GPLv3.

Setur upp Marcel Modern Shell í Linux

Marcel þarf Python 3.6 eða nýrri. Það hefur verið þróað og prófað á Linux og það virkar aðallega á macOS. (Ef þú vilt hjálpa til við að tengja við Windows eða laga macOS gallana skaltu hafa samband.)

Til að setja upp marcel til eigin nota:

# python3 -m pip install marcel

Eða ef þú vilt setja upp fyrir alla notendur (t.d. til /usr/local):

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

Þegar þú hefur sett upp marcel skaltu athuga hvort það virki með því að keyra skipunina marcel og keyra síðan útgáfuskipunina á marcel hvetjunni:

$ marcel

Sérsníða af Marcel Shell

Þú getur sérsniðið marcel í skránni ~/.marcel.py, sem lesin er við ræsingu (og lesin aftur þegar henni er breytt). Eins og þú sérð af nafni skrárinnar er sérsniðin marcel gerð í Python.

Eitt sem þú vilt líklega gera er að sérsníða fyrirmælin. Til að gera þetta, úthlutarðu lista við HREINA breytuna. Til dæmis, ef þú vilt að hvetja þín sé núverandi skrá, prentuð með grænu, á eftir > prentað með bláu:

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

Tilvitnunin sem myndast lítur svona út:

Þetta kemur í stað órannsakanlegrar PS1 stillingar sem þú þyrftir að gera í bash. Litur(0, 4, 0) tilgreinir grænt, (rökin eru RGB gildi, á bilinu 0-5). PWD er umhverfisbreytan sem táknar núverandi möppu og með lambda: forskeyti þessarar breytu myndar aðgerð sem metin er í hvert skipti sem hvetja birtist.

~/.marcel.py getur líka flutt inn Python einingar. T.d. ef þú vilt nota aðgerðir stærðfræðieiningarinnar í marcel skipunum þínum:

from math import *

Þegar þú hefur gert þetta geturðu vísað í tákn úr þeirri einingu, t.d. pi:

Athugaðu að pi er í sviga. Almennt, marcel notar sviga til að afmarka Python tjáning. Þannig að (pi) metur Python tjáninguna sem sækir gildi breytunnar pi. Einnig er hægt að nálgast hefðbundnar umhverfisbreytur á þennan hátt, t.d. (USER) og (HOME), eða hvaða gildri Python tjáningu sem treystir á tákn í nafnrými marcels.

Og þú getur auðvitað skilgreint þín eigin tákn. Til dæmis, ef þú setur þessa fallskilgreiningu í ~/.marcel.py:

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

þá er hægt að nota factorial fallið á skipanalínunni, t.d.

Marcel Shell Dæmi

Hér munum við læra nokkur dæmi um skipanir í marcel skelinni.

Kannaðu núverandi möppu endurkvæmt, flokkaðu skrárnar eftir endingum þeirra (t.d. .txt, .py og svo framvegis) og reiknaðu heildarskráarstærðina fyrir hvern hóp.

Þú getur gert þetta í marcel sem hér segir:

Ls rekstraraðilinn framleiðir straum af File hlutum, (-fr þýðir að heimsækja möppur afturkvæmt og skila aðeins skrám).

File hlutirnir eru fluttir í næstu skipun, kort. Kortið tilgreinir Python aðgerð, í ystu sviga, sem kortleggur hverja skrá að túllu sem inniheldur viðbót skráarinnar og stærð hennar. (Marcel leyfir að lambda lykilorðinu sé sleppt.)

Rauði (minnka) stjórnandinn flokkar eftir fyrsta hluta túpunnar (framlengingarinnar) og dregur síðan saman stærðirnar innan hvers hóps. Niðurstaðan er flokkuð eftir framlengingu.

Leiðslur geta innihaldið blöndu af marcel stjórnendum og hýsingarforritum. Rekstraraðilar pípa hluti, en á mörkum rekstraraðila/framkvæmanlegra, marcel pipes strengir í staðinn.

Til dæmis sameinar þessi skipun rekstraraðila og executables og listar notendanöfn notenda sem hafa skelið /bin/bash.

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

cat er Linux executable. Það les /etc/passwd og marcel sendir innihald þess niðurstreymis á marcel rekstrarkortið.

Svigarröksemdin til að kortleggja er Python-fall sem skiptir línunum við : skiljur, sem gefur 7-túlla. Select er marcel rekstraraðili þar sem röksemdafærslan er Python fall sem auðkennir þá tuples þar sem síðasti reiturinn er /bin/bash.

Næsti rekstraraðili, annað kort heldur notendanafnsviði hvers inntakstöflu. Að lokum sameinar xargs echo notendanöfnin sem koma inn í eina línu sem er prentuð í stdout.

Handrit í Marcel Shell

Þó að Python sé stundum talið vera forskriftarmál, virkar það í raun ekki vel í þeim tilgangi. Vandamálið er að keyra skel skipanir, og önnur keyrslur frá Python er fyrirferðarmikill. Þú getur notað os.system(), sem er einfalt en oft ófullnægjandi til að takast á við stdin, stdout og stderr. subprocess.Popen() er öflugra en flóknara í notkun.

Nálgun Marcel er að útvega einingu sem samþættir marcel rekstraraðila við tungumálaeiginleika Python. Til að rifja upp eldra dæmi, hér er Python kóðinn til að reikna út summan af skráarstærðum með framlengingu:

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})

Skeljaskipanirnar eru þær sömu og áður, nema setningafræðilegar venjur. Þannig að ls -fr breytist í ls(file=True, endurkvæmt=True). Kortið og rauðir rekstraraðilar eru þarna líka, tengdir með rörum, eins og í skel útgáfunni. Öll skel skipunin (ls … rauð) gefur Python endurtekningu svo hægt sé að nota skipunina með Python fyrir lykkju.

Gagnagrunnsaðgangur með Marcel Shell

Þú getur samþætt gagnagrunnsaðgang við marcel leiðslur. Fyrst þarftu að stilla aðgang að gagnagrunni í stillingarskránni, ~/.marcel.py, t.d.

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

DB_DEFAULT = 'jao'

Þetta stillir aðgang að Postgres gagnagrunni sem heitir acme, með því að nota psycopg2 rekilinn. Tengingar frá marcel verða gerðar með því að nota jao notandann og gagnagrunnssniðið er nefnt jao. (DB_DEFAULT tilgreinir jao gagnagrunnssniðið sem það sem á að nota ef ekkert snið er tilgreint.) Með þessari uppsetningu er nú hægt að spyrjast fyrir um gagnagrunninn með því að nota sql stjórnanda, t.d.

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

Þessi skipun leitar í töflu sem heitir hluti og setur niðurstöðu fyrirspurnarinnar í skrána ~/reorder.csv, á CSV sniði.

Fjaraðgangur með Marcel Shell

Líkt og gagnagrunnsaðgang er hægt að stilla fjaraðgang í ~/.marcel.py. Til dæmis stillir þetta 4-hnúta þyrping:

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'])

Hægt er að auðkenna klasann sem rannsóknarstofu í marcel skipunum. Notanda- og auðkennisfæribreyturnar tilgreina innskráningarupplýsingar og hýsilbreytan tilgreinir IP-tölur hnútanna í þyrpingunni.

Þegar þyrpingin hefur verið stillt er hægt að nota alla hnúta í einu. Til dæmis, til að fá lista yfir vinnslupids og skipanalínur yfir þyrpinguna:

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

Þetta skilar straumi af (IP tölu, PID, skipanalínu) tuples.

Fyrir frekari upplýsingar heimsækja:

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

Marcel er frekar nýr og í virkri þróun. Hafðu samband ef þú vilt aðstoða.