Marcel - Shell Aktar Moderna għal Linux


Marcel huwa qoxra ġdida. Huwa simili għal qxur tradizzjonali f'ħafna modi, iżda jagħmel ftit affarijiet differenti:

  • Piping: Il-qxur kollha jużaw pajpijiet biex jibagħtu test mill-output ta' kmand wieħed għad-dħul ta' ieħor. Marcel pipes data strutturata minflok strings.
  • Python: Marcel huwa implimentat f'Python, u jesponi Python f'numru ta' modi. Jekk għandek bżonn ftit ta' loġika fil-kmandi tiegħek, Marcel jippermettilek tesprimiha f'Python.
  • Kittajjar: Marcel jieħu approċċ mhux tas-soltu għall-kitba. Tista', ovvjament, sempliċement tikteb sekwenza ta' kmandi ta' marcel f'fajl ta' test u tesegwixxihom. Iżda Marcel jipprovdi wkoll API fil-forma ta 'modulu Python. Tista' timporta dan il-modulu biex tagħmel scripting Python b'mod ferm aktar konvenjenti milli hu possibbli b'Python sempliċi.

Marcel huwa liċenzjat taħt GPLv3.

Installazzjoni ta' Marcel Modern Shell fil-Linux

Marcel jeħtieġ Python 3.6 jew aktar tard. Ġie żviluppat u ttestjat fuq Linux, u jaħdem l-aktar fuq macOS. (Jekk tixtieq tgħin fil-port għall-Windows, jew biex tirranġa n-nuqqasijiet tal-macOS, ikkuntattja.)

Biex tinstalla marcel għall-użu tiegħek:

# python3 -m pip install marcel

Jew jekk trid tinstalla għall-utenti kollha (eż., għal /usr/local):

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

Ladarba tkun installat marcel, iċċekkja li qed jaħdem billi tħaddem il-kmand marcel, u mbagħad fil-pront ta' marcel, ħaddem il-kmand tal-verżjoni:

$ marcel

Personalizzazzjoni ta 'Marcel Shell

Tista' tippersonalizza marcel fil-fajl ~/.marcel.py, li jinqara mal-istartjar, (u jerġa' jinqara meta jiġi modifikat). Kif tista' tgħid mill-isem tal-fajl, il-personalizzazzjoni ta' marcel issir f'Python.

Ħaġa waħda li probabilment trid tagħmel hi li tippersonalizza l-pront. Biex tagħmel dan, tassenja lista għall-varjabbli PROMPT. Pereżempju, jekk trid li l-pront tiegħek ikun id-direttorju attwali, stampat bl-aħdar, segwit minn > stampat bil-blu:

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

Il-pront li jirriżulta jidher bħal dan:

Dan jissostitwixxi l-konfigurazzjoni inskrutabbli PS1 li jkollok bżonn tagħmel f'bash. Kulur (0, 4, 0) jispeċifika aħdar, (l-argumenti huma valuri RGB, fil-medda 0-5). PWD hija l-varjabbli ambjentali li tirrappreżenta d-direttorju attwali tiegħek u l-prefiss ta' din il-varjabbli b'lambda: jiġġenera funzjoni, evalwata kull darba li jintwera l-pront.

Il-~/.marcel.py jista 'wkoll jimporta moduli Python. Eż., jekk trid tuża l-funzjonijiet tal-modulu tal-matematika fil-kmandi tiegħek ta' marcel:

from math import *

Ladarba tkun għamilt dan, tista' tirreferi għal simboli minn dak il-modulu, eż. pi:

Innota li pi huwa parentesi. B'mod ġenerali, marcel juża parentesi biex jiddelimita l-espressjonijiet Python. Allura (pi) jevalwa l-espressjoni Python li tirkupra l-valur tal-varjabbli pi. Tista' wkoll taċċessa varjabbli ambjentali tradizzjonali b'dan il-mod, eż. (USER) u (HOME), jew kwalunkwe espressjoni Python valida li tiddependi fuq simboli fl-ispazju tal-isem ta’ marcel.

U tista ', ovvjament, tiddefinixxi s-simboli tiegħek stess. Pereżempju, jekk tpoġġi din id-definizzjoni tal-funzjoni f'~/.marcel.py:

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

allura tista 'tuża l-funzjoni fatturi fuq il-linja tal-kmand, eż.

Marcel Shell Eżempji

Hawnhekk, se nitgħallmu xi eżempji ta 'kmandi fil-qoxra ta' marcel.

Esplora d-direttorju attwali b'mod rikorsiv, iggruppa l-fajls bl-estensjoni tagħhom (eż. .txt, .py u l-bqija), u kkalkula d-daqs totali tal-fajl għal kull grupp.

Tista' tagħmel dan f'Marcel kif ġej:

L-operatur ls jipproduċi fluss ta' oġġetti tal-Fajl, (-fr tfisser żur direttorji b'mod rikorsiv, u jirritorna biss fajls).

L-oġġetti tal-Fajl jitmexxew lejn il-kmand li jmiss, il-mappa. Il-mappa tispeċifika funzjoni Python, fil-parentesi l-aktar 'il barra, li timmappa kull fajl għal tuple li fih l-estensjoni tal-fajl, u d-daqs tiegħu. (Marcel jippermetti li titħalla barra l-kelma prinċipali lambda.)

L-operatur aħmar (naqqas), jiġbor bl-ewwel parti tat-tuple (estensjoni) u mbagħad jiġbor id-daqsijiet f'kull grupp. Ir-riżultat huwa magħżul skond l-estensjoni.

Il-pipelines jista' jkun fihom taħlita ta' operaturi marcel u eżekutibbli ospitanti. Operaturi pajp oġġetti, iżda fil-konfini operatur/eżekubbli, marcel pajp kordi minflok.

Pereżempju, dan il-kmand jgħaqqad l-operaturi u l-eżekutibbli u jelenka l-ismijiet tal-utenti tal-utenti li l-qoxra tagħhom hija /bin/bash.

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

cat huwa eżekutibbli Linux. Jaqra /etc/passwd, u marcel iwassal il-kontenut tiegħu 'l isfel lejn il-mappa tal-operatur marcel.

L-argument parentesi għall-immappjar huwa funzjoni Python li taqsam il-linji fis-separaturi :, li tagħti 7-tuples. Select huwa operatur marcel li l-argument tiegħu huwa funzjoni Python li tidentifika dawk it-tuples li fihom l-aħħar qasam huwa /bin/bash.

L-operatur li jmiss, mappa oħra żżomm il-qasam tal-isem tal-utent ta 'kull tuple input. Fl-aħħarnett, xargs echo jgħaqqad l-ismijiet tal-utent deħlin f'linja waħda, li hija stampata fuq stdout.

Skript f'Marcel Shell

Filwaqt li Python kultant jitqies bħala lingwa tal-kitba, fil-fatt ma jaħdimx tajjeb għal dak il-għan. Il-problema hija li t-tmexxija tal-kmandi tal-qoxra, u eżekutibbli oħra minn Python hija ingombranti. Tista' tuża os.system(), li hija sempliċi iżda ħafna drabi inadegwata biex tittratta stdin, stdout, u stderr. subprocess.Popen() huwa aktar qawwi iżda aktar kumpless biex jintuża.

L-approċċ ta 'Marcel huwa li jipprovdi modulu li jintegra l-operaturi marcel mal-karatteristiċi tal-lingwa ta' Python. Biex tirrevedi eżempju preċedenti, hawn huwa l-kodiċi Python għall-komputazzjoni tas-somma tad-daqsijiet tal-fajls b'estensjoni:

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

Il-kmandi tal-qoxra huma l-istess bħal qabel, ħlief għall-konvenzjonijiet sintattiċi. Allura ls -fr jinbidel f'ls(file=True, recursive=Veru). Il-mappa u l-operaturi ħomor qegħdin hemm ukoll, konnessi ma 'pajpijiet, bħal fil-verżjoni tal-qoxra. Il-kmand tal-qoxra kollu (ls ... aħmar) jagħti iteratur Python sabiex il-kmand ikun jista 'jintuża ma' Python għal linja.

Aċċess għal Database ma' Marcel Shell

Tista 'tintegra l-aċċess tad-database ma' pipelines Marcel. L-ewwel, għandek bżonn tikkonfigura l-aċċess tad-database fil-fajl tal-konfigurazzjoni, ~/.marcel.py, eż.

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

DB_DEFAULT = 'jao'

Dan jikkonfigura l-aċċess għal database Postgres bl-isem acme, bl-użu tas-sewwieq psycopg2. Il-konnessjonijiet minn marcel se jsiru bl-użu tal-utent jao, u l-profil tad-database jismu jao. (DB_DEFAULT jispeċifika l-profil tad-database jao bħala dak li għandu jintuża jekk l-ebda profil ma jkun speċifikat.) B'din il-konfigurazzjoni magħmula, id-database issa tista 'tiġi mistoqsija billi tuża l-operatur sql, eż.

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

Dan il-kmand jistaqsi tabella msemmija parti, u jpoġġi r-riżultat tal-mistoqsija fil-fajl ~/reorder.csv, f'format CSV.

Aċċess mill-bogħod ma' Marcel Shell

Bl-istess mod għall-aċċess għad-database, l-aċċess mill-bogħod jista’ jiġi kkonfigurat f’~/.marcel.py. Pereżempju, dan jikkonfigura cluster b'4 nodi:

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

Il-cluster jista 'jiġi identifikat bħala laboratorju fil-kmandi ta' marcel. Il-parametri tal-utent u tal-identità jispeċifikaw l-informazzjoni tal-login, u l-parametru ospitanti jispeċifika l-indirizzi IP tan-nodi fuq il-cluster.

Ladarba l-cluster jiġi kkonfigurat, in-nodi kollha jistgħu jitħaddmu f'daqqa. Per eżempju, biex tikseb lista ta 'pids tal-proċess u linji ta' kmand madwar il-cluster:

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

Dan jirritorna fluss ta' (indirizz IP, PID, linja tal-kmand) tuples.

Għal aktar informazzjoni żur:

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

Marcel huwa pjuttost ġdid u taħt żvilupp attiv. Ikkuntattja jekk tixtieq tgħin.