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.