Marcel - nykyaikaisempi kuori Linuxille


Marcel on uusi kuori. Se on samanlainen kuin perinteiset kuoret monin tavoin, mutta se tekee muutamia asioita eri tavalla:

  • Putkisto: Kaikki kuoret käyttävät putkia lähettämään tekstiä yhden komennon lähdöstä toisen komentoon. Marcel piirtää jäsenneltyjä tietoja merkkijonojen sijaan.
  • Python: Marcel on toteutettu Pythonissa, ja se paljastaa Pythonin monin tavoin. Jos tarvitset hieman logiikkaa komentoihisi, marcel antaa sinun ilmaista se Pythonissa.
  • Komentosarjat: Marcel suhtautuu epätavallisesti komentosarjoihin. Voit tietysti yksinkertaisesti kirjoittaa sarjan marcel-komentoja tekstitiedostoon ja suorittaa ne. Mutta Marcel tarjoaa myös API: n Python-moduulin muodossa. Voit tuoda tämän moduulin tekemään Python-komentosarjoja paljon mukavammalla tavalla kuin se on mahdollista tavallisen Pythonin kanssa.

Marcelilla on GPLv3-lisenssi.

Marcel Modern Shellin asentaminen Linuxiin

Marcel vaatii Python 3.6: n tai uudemman. Se on kehitetty ja testattu Linuxilla, ja se toimii lähinnä macOS: lla. (Jos haluat auttaa siirtämään Windowsin tai korjaamaan macOS-puutteet, ota yhteyttä.)

Marcelin asentaminen omaan käyttöön:

# python3 -m pip install marcel

Tai jos haluat asentaa kaikille käyttäjille (esim. /usr/local ):

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

Kun olet asentanut marcelin, tarkista, että se toimii suorittamalla komento marcel ja suorita sitten marcel-kehotteessa version-komento:

$ marcel

Marcel Shellin räätälöinti

Voit mukauttaa marcelia tiedostossa ~/.marcel.py , joka luetaan käynnistyksen yhteydessä (ja luetaan uudelleen, kun sitä muutetaan). Kuten voit selvittää tiedoston nimestä, marcelin mukauttaminen tapahtuu Pythonissa.

Yksi asia, jonka haluat todennäköisesti tehdä, on mukauttaa kehote. Tätä varten määrität luettelon PROMPT-muuttujalle. Esimerkiksi, jos haluat kehotteen olevan nykyinen hakemisto, painettu vihreällä ja sen jälkeen > sinisellä painettuna:

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

Tuloksena oleva kehote näyttää tältä:

Tämä korvaa salaamattoman PS1 -määrityksen, joka sinun on tehtävä bashissa. Väri (0, 4, 0) määrittää vihreän (argumentit ovat RGB-arvoja alueella 0-5). PWD on ympäristömuuttuja, joka edustaa nykyistä hakemistoa ja jonka etuliite on lambda: , joka luo toiminnon, joka arvioidaan joka kerta, kun kehote näytetään.

~/.marcel.py voi myös tuoda Python-moduuleja. Jos esimerkiksi haluat käyttää matematiikkamoduulin toimintoja marcel-komennoissa:

from math import *

Kun olet tehnyt tämän, voit viitata kyseisen moduulin symboleihin, esim. pi :

Huomaa, että pi on sulkeissa. Yleensä marcel käyttää sulkeita Python-lausekkeiden rajaamiseen. Joten (pi) arvioi Python-lausekkeen, joka noutaa muuttujan pi arvon. Voit myös käyttää perinteisiä ympäristömuuttujia tällä tavoin, esim. (USER) ja (HOME) tai mikä tahansa kelvollinen Python-lauseke, joka perustuu symboleihin marcelin nimiavaruudessa.

Ja voit tietysti määrittää omat symbolisi. Esimerkiksi, jos laitat tämän funktion määritelmän kohtaan ~/.marcel.py :

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

silloin voit käyttää komentorivillä kerroinfunktiota, esim.

Marcel Shell -esimerkkejä

Täältä opit joitain esimerkkejä komentoista marcel-kuoressa.

Tutki nykyistä hakemistoa rekursiivisesti, ryhmitä tiedostot niiden laajennusten mukaan (esim. .txt , .py ja niin edelleen) ja laske kunkin ryhmän tiedostokoko.

Voit tehdä tämän marcelissa seuraavasti:

Ls-operaattori tuottaa tiedostoobjektivirran (( -fr tarkoittaa vierailuhakemistoja rekursiivisesti ja palauttaa vain tiedostot).

Tiedosto-objektit ohjataan seuraavaan komentoon, karttaan. Kartta määrittelee Python-toiminnon uloimmissa suluissa, joka kartoittaa jokaisen tiedoston tiedostoon, joka sisältää tiedoston laajennuksen ja sen koon. (Marcel sallii lambda-avainsanan jättämisen pois.)

Punainen (pienennä) operaattori ryhmitellään dupleksin (jatkeen) ensimmäisen osan mukaan ja summataan sitten kunkin ryhmän koot. Tulos lajitellaan laajennuksen mukaan.

Putkilinjat voivat sisältää sekoitus pakettioperaattoreita ja isäntäkoneita. Operaattorit putkivat esineitä, mutta operaattorin/suoritettavan rajan kohdalla marcel-putket jousivat.

Esimerkiksi tämä komento yhdistää operaattorit ja suoritettavat tiedostot ja listaa niiden käyttäjien käyttäjätunnukset, joiden kuori on /bin/bash .

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

cat on Linux-suoritettava tiedosto. Se lukee/etc/passwd, ja marcel vie sisällönsä alavirtaan marrasoperaattorin kartalle.

Suluissa oleva argumentti kartoitettavaksi on Python-funktio, joka jakaa viivat : -erottimissa ja tuottaa 7 joukkoa. Select on marcel-operaattori, jonka argumentti on Python-funktio, joka tunnistaa ne joukot, joissa viimeinen kenttä on/bin/bash.

Seuraava operaattori, toinen kartta, pitää kunkin syöttökentän käyttäjätunnuskentän. Lopuksi, xargs echo yhdistää saapuvat käyttäjätunnukset yhdeksi riviksi, joka tulostetaan vakiona.

Komentosarjat Marcel Shellissä

Vaikka Pythonia pidetään joskus komentosarjakielenä, se ei todellakaan toimi hyvin tähän tarkoitukseen. Ongelmana on, että shell-komentojen ja muiden Python-ohjelmien suorittaminen on hankalaa. Voit käyttää os.system() -kuvaketta, joka on yksinkertainen mutta usein riittämätön stdin-, stdout- ja stderr-tiedostojen käsittelemiseen. subprocess.Popen() on tehokkaampi, mutta monimutkaisempi käyttää.

Marcelin lähestymistapa on tarjota moduuli, joka integroi marcel-operaattorit Pythonin kieliominaisuuksiin. Palataksesi aikaisempaan esimerkkiin, tässä on Python-koodi tiedostokokojen summan laskemiseksi laajennuksella:

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

Kuorikomennot ovat samat kuin aiemmin lukuun ottamatta syntaktisia käytäntöjä. Joten ls -fr muuttuu ls: ksi (tiedosto = tosi, rekursiivinen = tosi). Kartta ja punaiset operaattorit ovat myös siellä, liitetty putkiin, kuten kuoriversiossa. Koko komentokomento (ls ... punainen) tuottaa Python-iteraattorin, jotta komentoa voidaan käyttää Pythonin kanssa silmukassa.

Marcel Shellin käyttö tietokantaan

Voit integroida tietokannan käytön marcel-putkilinjoihin. Ensinnäkin sinun on määritettävä tietokannan käyttöasetustiedostossa ~/.marcel.py , esim.

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

DB_DEFAULT = 'jao'

Tämä määrittää pääsyn Postgres-tietokantaan nimeltä acme psycopg2-ohjainta käyttämällä. Yhteydet marcelista tehdään jao-käyttäjän avulla, ja tietokantaprofiili on nimeltään jao. (DB_DEFAULT määrittää jao-tietokantaprofiilin käytettäväksi, jos profiilia ei ole määritetty.) Kun tämä kokoonpano on tehty, tietokannasta voidaan nyt kysyä sql-operaattorin avulla, esim.

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

Tämä komento kyselee taulukon nimeltä osa ja kaataa kyselyn tuloksen tiedostoon ~/reorder.csv CSV-muodossa.

Etäkäyttö Marcel Shellin kanssa

Samoin kuin tietokantakäytössä, etäkäyttö voidaan määrittää kohdassa ~/.marcel.py . Esimerkiksi tämä määrittää 4-solmun klusterin:

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

Klusteri voidaan tunnistaa laboratoriona marcel-komennoissa. Käyttäjä- ja identiteettiparametrit määrittävät kirjautumistiedot ja isäntäparametri määrittää klusterin solmujen IP-osoitteet.

Kun klusteri on määritetty, kaikkia solmuja voidaan käyttää kerralla. Esimerkiksi, jos haluat saada luettelon prosessin pidistä ja komentoriveistä klusterissa:

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

Tämä palauttaa virran (IP-osoite, PID, komentorivi) sarjoista.

Lisätietoja:

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

Marcel on melko uusi ja aktiivisesti kehitteillä. Ota yhteyttä, jos haluat auttaa.