Marcel - Shell ya Kisasa Zaidi ya Linux


Marcel ni ganda jipya. Ni sawa na makombora ya kitamaduni kwa njia nyingi, lakini hufanya mambo machache tofauti:

  • Kubomba: Kombora zote hutumia mirija kutuma maandishi kutoka kwa pato la amri moja hadi ingizo la nyingine. Marcel huweka data iliyopangwa badala ya mifuatano.
  • Python: Marcel inatekelezwa katika Python, na inafichua Python kwa njia kadhaa. Ikiwa unahitaji mantiki kidogo katika amri zako, marcel inakuruhusu kuieleza kwa Python.
  • Kuandika: Marcel huchukua mbinu isiyo ya kawaida ya uandishi. Unaweza, bila shaka, kuandika tu mlolongo wa amri za marcel katika faili ya maandishi na kuzitekeleza. Lakini Marcel pia hutoa API katika mfumo wa moduli ya Python. Unaweza kuleta moduli hii kufanya uandishi wa Python kwa njia rahisi zaidi kuliko inavyowezekana na Chatu wazi.

Marcel amepewa leseni chini ya GPLv3.

Kufunga Marcel Modern Shell katika Linux

Marcel inahitaji Python 3.6 au baadaye. Imetengenezwa na kujaribiwa kwenye Linux, na inafanya kazi zaidi kwenye macOS. (Ikiwa ungependa kusaidia kuingia kwenye Windows, au kurekebisha kasoro za macOS, wasiliana.)

Ili kusakinisha marcel kwa matumizi yako mwenyewe:

# python3 -m pip install marcel

Au ikiwa unataka kusakinisha kwa watumiaji wote (k.m., hadi /usr/local):

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

Mara baada ya kusakinisha marcel, hakikisha kwamba inafanya kazi kwa kuendesha amri marcel, na kisha kwa haraka ya marcel, endesha amri ya toleo:

$ marcel

Ubinafsishaji wa Marcel Shell

Unaweza kubinafsisha marcel katika faili ~/.marcel.py, ambayo husomwa wakati wa kuanza, (na kusoma tena inaporekebishwa). Kama unavyoweza kusema kutoka kwa jina la faili, ubinafsishaji wa marcel unafanywa katika Python.

Jambo moja labda ungependa kufanya ni kubinafsisha arifa. Ili kufanya hivyo, unapeana orodha kwa tofauti ya PROMPT. Kwa mfano, ikiwa unataka kidokezo chako kuwa saraka ya sasa, iliyochapishwa kwa kijani kibichi, ikifuatiwa na > iliyochapishwa kwa bluu:

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

Agizo linalosababisha linaonekana kama hii:

Hii inachukua nafasi ya PS1 usanidi usioweza kuchunguzwa ambao utahitaji kufanya katika bash. Rangi(0, 4, 0) hubainisha kijani, (hoja ni thamani za RGB, katika safu 0-5). PWD ni kigezo cha mazingira kinachowakilisha saraka yako ya sasa na kuakisi utaftaji huu kwa lambda: hutengeneza chaguo la kukokotoa, linalotathminiwa kila wakati kidokezo kinaonyeshwa.

~/.marcel.py pia inaweza kuleta moduli za Python. Kwa mfano, ikiwa unataka kutumia kazi za moduli ya hesabu katika amri zako za marcel:

from math import *

Ukishafanya hivi, unaweza kurejelea alama kutoka kwa moduli hiyo, k.m. pi:

Kumbuka kuwa pi imewekwa kwenye mabano. Kwa ujumla, marcel hutumia mabano kuweka mipaka ya maneno ya Python. Kwa hivyo (pi) inatathmini usemi wa Python ambao hupata thamani ya pi ya kutofautisha. Unaweza pia kufikia anuwai za mazingira ya kitamaduni kwa njia hii, k.m. (USER) na (NYUMBANI), au usemi wowote halali wa Python unaotegemea alama kwenye nafasi ya majina ya marcel.

Na unaweza, bila shaka, kufafanua alama zako mwenyewe. Kwa mfano, ukiweka ufafanuzi huu wa utendakazi katika ~/.marcel.py:

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

basi unaweza kutumia kazi ya ukweli kwenye mstari wa amri, k.m.

Mifano ya Marcel Shell

Hapa, tutajifunza baadhi ya mifano ya amri kwenye ganda la marcel.

Chunguza saraka ya sasa kwa kujirudia, panga faili kulingana na kiendelezi chake (k.m. .txt, .py na kadhalika), na ukokote saizi ya jumla ya faili kwa kila kikundi.

Unaweza kufanya hivyo katika marcel kama ifuatavyo:

Opereta ls hutoa mtiririko wa vipengee vya Faili, (-fr inamaanisha kutembelea saraka kwa kujirudia, na kurudisha faili pekee).

Vitu vya Faili vinatumwa kwa amri inayofuata, ramani. Ramani inabainisha kazi ya Python, kwenye mabano ya nje, ambayo huweka kila faili kwenye nakala iliyo na kiendelezi cha faili, na saizi yake. (Marcel huruhusu neno kuu la lambda kuachwa.)

Opereta nyekundu (punguza), vikundi kwa sehemu ya kwanza ya tuple (kiendelezi) na kisha muhtasari wa saizi ndani ya kila kikundi. Matokeo hupangwa kwa ugani.

Mabomba yanaweza kuwa na mchanganyiko wa waendeshaji marcel na utekelezaji wa seva pangishi. Vitu vya bomba vya waendeshaji, lakini kwenye mipaka ya mwendeshaji/ inayoweza kutekelezwa, kamba za mabomba ya marcel badala yake.

Kwa mfano, amri hii inachanganya waendeshaji na wanaoweza kutekelezwa na kuorodhesha majina ya watumiaji ambao shell yao ni /bin/bash.

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

paka ni Linux inayoweza kutekelezwa. Inasoma /etc/passwd, na marcel inasambaza yaliyomo chini ya ramani ya opereta ya marcel.

Hoja ya mabano kwa ramani ni chaguo la kukokotoa la Python ambalo hugawanya mistari kwenye vitenganishi vya :, ikitoa nakala-7. Chaguo ni mwendeshaji wa marcel ambaye hoja yake ni kazi ya Python inayotambulisha nakala hizo ambazo uga wa mwisho ni /bin/bash.

Opereta anayefuata, ramani nyingine huweka uga wa jina la mtumiaji wa kila nakala ya ingizo. Hatimaye, xargs echo inachanganya majina ya watumiaji yanayoingia kwenye mstari mmoja, ambao umechapishwa kwa stdout.

Kuandika hati katika Marcel Shell

Wakati Python wakati mwingine inachukuliwa kuwa lugha ya maandishi, haifanyi kazi vizuri kwa kusudi hilo. Shida ni kwamba kuendesha amri za ganda, na utekelezwaji mwingine kutoka kwa Python ni ngumu. Unaweza kutumia os.system(), ambayo ni rahisi lakini mara nyingi haitoshi kushughulika na stdin, stdout, na stderr. subprocess.Popen() ina nguvu zaidi lakini ngumu zaidi kutumia.

Mbinu ya Marcel ni kutoa moduli inayounganisha waendeshaji marcel na vipengele vya lugha ya Python. Ili kutazama tena mfano wa mapema, hapa kuna nambari ya Python ya kukusanya jumla ya saizi za faili kwa ugani:

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

Amri za shell ni sawa na hapo awali, isipokuwa kwa kanuni za kisintaksia. Kwa hivyo ls -fr inabadilika kuwa ls(file=True, recursive=True). Ramani na waendeshaji nyekundu zipo pia, zimeunganishwa na bomba, kama ilivyo kwenye toleo la ganda. Amri nzima ya ganda (ls ... nyekundu) hutoa kiboreshaji cha Python ili amri itumike na Python's kwa kitanzi.

Ufikiaji wa Hifadhidata na Marcel Shell

Unaweza kuunganisha ufikiaji wa hifadhidata na mabomba ya marcel. Kwanza, unahitaji kusanidi ufikiaji wa hifadhidata katika faili ya usanidi, ~/.marcel.py, k.m.

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

DB_DEFAULT = 'jao'

Hii inasanidi ufikiaji wa hifadhidata ya Postgres inayoitwa acme, kwa kutumia kiendeshi cha psycopg2. Miunganisho kutoka kwa marcel itafanywa kwa kutumia mtumiaji wa jao, na wasifu wa hifadhidata unaitwa jao. (DB_DEFAULT inabainisha wasifu wa hifadhidata ya jao kama ule utakaotumika ikiwa hakuna wasifu uliobainishwa.) Usanidi huu ukifanywa, hifadhidata sasa inaweza kuulizwa kwa kutumia opereta wa sql, k.m.

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

Amri hii huuliza jedwali lililopewa jina la sehemu, na hutupa matokeo ya swali kwenye faili ~/reorder.csv, katika umbizo la CSV.

Ufikiaji wa Mbali na Marcel Shell

Vile vile kwa ufikiaji wa hifadhidata, ufikiaji wa mbali unaweza kusanidiwa katika ~/.marcel.py. Kwa mfano, hii inasanidi nguzo ya nodi 4:

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

Nguzo inaweza kutambuliwa kama maabara katika amri za marcel. Vigezo vya mtumiaji na utambulisho vinabainisha maelezo ya kuingia, na kigezo cha mwenyeji kinabainisha anwani za IP za nodi kwenye nguzo.

Mara baada ya nguzo kusanidiwa, nodi zote zinaweza kuendeshwa mara moja. Kwa mfano, kupata orodha ya pids za mchakato na mistari ya amri kwenye nguzo:

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

Hii inarudisha mtiririko wa (anwani ya IP, PID, safu ya amri) nakala.

Kwa taarifa zaidi tembelea:

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

Marcel ni mpya sana na yuko chini ya maendeleo amilifu. Wasiliana kama ungependa kusaidia.