Marcel - Usa ka Mas Modernong Shell alang sa Linux


Bag-ong kabhang si Marcel. Kini susama sa tradisyonal nga mga kabhang sa daghang mga paagi, apan kini naghimo sa pipila ka mga butang nga lahi:

  • Piping: Ang tanang shell naggamit ug pipe para magpadala ug text gikan sa output sa usa ka command ngadto sa input sa lain. Si Marcel nagbutang ug structured data imbes nga mga string.
  • Python: Gipatuman si Marcel sa Python, ug gibutyag ang Python sa daghang paagi. Kung kinahanglan nimo ang gamay nga lohika sa imong mga mando, gitugotan ka ni marcel nga ipahayag kini sa Python.
  • Pagsulat: Si Marcel naggamit ug dili kasagarang paagi sa pag-script. Mahimo nimo, siyempre, pagsulat lang sa usa ka han-ay sa marcel commands sa usa ka text file ug ipatuman kini. Apan naghatag usab si Marcel og API sa porma sa module sa Python. Mahimo nimong i-import kini nga module aron mahimo ang Python scripting sa labi ka dali nga paagi kaysa mahimo sa yano nga Python.

Si Marcel lisensyado ubos sa GPLv3.

Pag-instalar sa Marcel Modern Shell sa Linux

Gikinahanglan ni Marcel ang Python 3.6 o mas ulahi. Naugmad ug gisulayan kini sa Linux, ug kasagaran kini nagtrabaho sa macOS. (Kung gusto nimong tabangan ang port sa Windows, o aron ayohon ang mga kakulangan sa macOS, kontaka.)

Aron ma-install ang marcel para sa imong kaugalingon nga paggamit:

# python3 -m pip install marcel

O kung gusto nimo i-install para sa tanan nga tiggamit (pananglitan, sa /usr/local):

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

Kung na-install na nimo ang marcel, susiha nga kini nagtrabaho pinaagi sa pagpadagan sa command marcel, ug dayon sa marcel prompt, padagana ang bersyon nga sugo:

$ marcel

Pag-customize sa Marcel Shell

Mahimo nimong ipasibo ang marcel sa file ~/.marcel.py, nga mabasa sa pagsugod, (ug basahon pag-usab kung giusab). Sama sa imong nahibal-an gikan sa ngalan sa file, ang pag-customize sa marcel gihimo sa Python.

Usa ka butang nga tingali gusto nimong buhaton mao ang pag-customize sa prompt. Aron mahimo kini, magbutang ka usa ka lista sa variable nga PROMPT. Pananglitan, kung gusto nimo nga ang imong prompt mao ang kasamtangan nga direktoryo, giimprinta sa berde, gisundan sa > nga giimprinta sa asul:

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

Ang resulta nga prompt ingon niini:

Gipulihan niini ang dili matukib nga PS1 configuration nga kinahanglan nimong buhaton sa bash. Ang kolor(0, 4, 0) nagtino sa berde, (ang mga argumento kay RGB values, sa range 0-5). Ang PWD mao ang environment variable nga nagrepresentar sa imong kasamtangan nga direktoryo ug nag-prefix niini nga variable gamit ang lambda: naghimo og function, gi-evaluate sa matag higayon nga ipakita ang prompt.

Ang ~/.marcel.py mahimo usab nga mag-import sa mga module sa Python. Pananglitan, kung gusto nimo gamiton ang mga function sa math module sa imong marcel commands:

from math import *

Kung nahuman na nimo kini, mahimo nimong i-refer ang mga simbolo gikan sa kana nga module, pananglitan. pi:

Timan-i nga ang pi gi-parentesis. Sa kinatibuk-an, gigamit ni marcel ang mga parentesis aron limitahan ang mga ekspresyon sa Python. Busa ang (pi) nag-evaluate sa Python expression nga nagkuha sa bili sa variable pi. Mahimo usab nimo ma-access ang tradisyonal nga mga variable sa palibot niining paagiha, pananglitan. (USER) ug (HOME), o bisan unsang balido nga ekspresyon sa Python nga nagsalig sa mga simbolo sa namespace ni marcel.

Ug mahimo nimo, siyempre, ipasabut ang imong kaugalingon nga mga simbolo. Pananglitan, kung imong ibutang kini nga kahulugan sa function sa ~/.marcel.py:

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

unya mahimo nimong gamiton ang factorial function sa command line, e.g.

Mga Ehemplo sa Marcel Shell

Dinhi, atong mahibal-an ang pipila ka mga pananglitan sa mga sugo sa marcel shell.

Pag-usisa sa kasamtangan nga direktoryo sa balik-balik nga paagi, paggrupo ang mga file sa ilang extension (eg .txt, .py ug uban pa), ug kwentaha ang kinatibuk-ang gidak-on sa file para sa matag grupo.

Mahimo nimo kini sa marcel sama sa mosunod:

Ang operator sa ls naghimo ug usa ka sapa sa mga butang nga File, (-fr nagpasabut nga pagbisita sa mga direktoryo nga balikbalik, ug ibalik ra ang mga file).

Ang mga butang sa File gipa-pipe sa sunod nga command, mapa. Ang mapa nagtino sa usa ka Python function, sa pinakagawas nga parentheses, nga nag-mapa sa matag file ngadto sa tuple nga adunay extension sa file, ug kini ang gidak-on. (Gitugotan ni Marcel ang lambda nga keyword nga tangtangon.)

Ang red (reduce) operator, mga grupo sa unang bahin sa tuple (extension) ug dayon summa sa mga gidak-on sulod sa matag grupo. Ang resulta gisunod pinaagi sa extension.

Ang mga pipelines mahimong adunay sagol nga marcel operators ug host executables. Operators pipe nga mga butang, apan sa operator/executable boundaries, marcel pipes strings sa baylo.

Pananglitan, kini nga sugo naghiusa sa mga operator ug mga executable ug naglista sa mga username sa mga tiggamit kansang shell mao ang /bin/bash.

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

iring kay usa ka Linux executable. Gibasa niini ang /etc/passwd, ug gipaagi ni marcel ang mga sulod niini sa ubos sa marcel operator nga mapa.

Ang parenthesized nga argumento sa mapa kay usa ka Python function nga nagbahin sa mga linya sa : separator, nga naghatag ug 7-tuples. Ang usa ka pili mao ang usa ka marcel operator kansang argumento usa ka Python function nga nagpaila sa mga tuple diin ang katapusan nga field mao ang /bin/bash.

Ang sunod nga operator, laing mapa ang nagtipig sa username field sa matag input tuple. Sa katapusan, ang xargs echo naghiusa sa umaabot nga mga username ngadto sa usa ka linya, nga giimprinta sa stdout.

Pagsulat sa Marcel Shell

Samtang ang Python usahay giisip nga usa ka sinultian sa script, dili gyud kini molihok nga maayo alang sa kana nga katuyoan. Ang problema mao nga ang pagpadagan sa mga shell command, ug uban pang mga executable gikan sa Python lisud. Mahimo nimong gamiton ang os.system(), nga yano apan kasagaran dili igo alang sa pagdumala sa stdin, stdout, ug stderr. subprocess.Popen() mas gamhanan pero mas komplikado gamiton.

Ang pamaagi ni Marcel mao ang paghatag og module nga nag-integrate sa mga operator sa marcel sa mga feature sa pinulongan sa Python. Sa pagduaw pag-usab sa usa ka sayo nga pananglitan, ania ang Python code alang sa pag-compute sa gidaghanon sa mga gidak-on sa file pinaagi sa extension:

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

Ang mga sugo sa kabhang parehas sa una, gawas sa mga syntactic convention. Busa ang ls -fr nahimong ls(file=True, recursive=True). Ang mapa ug pula nga mga operator anaa usab, konektado sa mga tubo, sama sa bersyon sa kabhang. Ang tibuok shell command (ls ... red) mohatag ug Python iterator aron ang command magamit sa Python's for a loop.

Pag-access sa Database kauban si Marcel Shell

Mahimo nimong i-integrate ang database access sa marcel pipelines. Una, kinahanglan nimong i-configure ang access sa database sa config file, ~/.marcel.py, e.g.

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

DB_DEFAULT = 'jao'

Gi-configure niini ang pag-access sa database sa Postgres nga ginganlag acme, gamit ang driver sa psycopg2. Ang mga koneksyon gikan ni marcel himoon gamit ang jao user, ug ang database profile ginganlan og jao. (Gitino sa DB_DEFAULT ang profile sa database sa jao ingon nga usa nga gamiton kung wala’y gipiho nga profile.) Sa kini nga pag-configure nga nahimo, ang database mahimo nang mapangutana gamit ang sql operator, pananglitan.

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

Kini nga sugo nagpangutana sa usa ka lamesa nga gihinganlan og bahin, ug gilabay ang resulta sa pangutana ngadto sa file ~/reorder.csv, sa CSV format.

Remote Access sa Marcel Shell

Susama sa pag-access sa database, ang layo nga pag-access mahimong ma-configure sa ~/.marcel.py. Pananglitan, kini nag-configure sa usa ka 4-node cluster:

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

Ang cluster mahimong mailhan isip usa ka lab sa marcel commands. Ang user ug identity parameters nagtino sa impormasyon sa pag-login, ug ang host parameter nagtino sa mga IP address sa mga node sa cluster.

Kung ma-configure na ang cluster, ang tanan nga mga node mahimong maoperahan sa usa ka higayon. Pananglitan, aron makakuha usa ka lista sa mga pid sa proseso ug mga linya sa mando sa tibuuk nga cluster:

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

Nagbalik kini sa usa ka sapa sa (IP address, PID, command line) tuples.

Para sa dugang impormasyon bisitaha:

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

Si Marcel bag-o ug ubos sa aktibo nga pag-uswag. Kontaka kung gusto nimo nga motabang.