Marcel - Moderni Shell Linuxille


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

  • Putkitus: Kaikki kuoret käyttävät putkia tekstin lähettämiseen yhden komennon lähdöstä toisen komennon tuloon. Marcel ohjaa strukturoitua dataa merkkijonojen sijaan.
  • Python: Marcel on toteutettu Pythonissa ja paljastaa Pythonin useilla tavoilla. Jos tarvitset hieman logiikkaa komentoissasi, marcel antaa sinun ilmaista sen Pythonissa.
  • Komentosarjat: Marcelilla on epätavallinen lähestymistapa käsikirjoitukseen. Voit tietysti yksinkertaisesti kirjoittaa marcel-komentojen sarjan tekstitiedostoon ja suorittaa ne. Mutta Marcel tarjoaa myös API:n Python-moduulin muodossa. Voit tuoda tämän moduulin tehdäksesi Python-komentosarjan paljon kätevämmällä tavalla kuin tavallisella Pythonilla.

Marcel on lisensoitu GPLv3:lla.

Marcel Modern Shellin asentaminen Linuxiin

Marcel vaatii Python 3.6:n tai uudemman. Se on kehitetty ja testattu Linuxissa, ja se toimii enimmäkseen macOS:ssä. (Jos haluat auttaa siirtämisessä Windowsiin tai korjaamaan macOS-puutteita, ota yhteyttä.)

Asenna marcel omaan käyttöön seuraavasti:

python3 -m pip install marcel

Tai jos haluat asentaa kaikille käyttäjille (esim. osoitteeseen /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 versio. komento:

marcel

Marcel Shellin räätälöinti

Voit muokata marcelia tiedostossa ~/.marcel.py, joka luetaan käynnistyksen yhteydessä (ja luetaan uudelleen, kun sitä muutetaan). Kuten tiedoston nimestä voi päätellä, marcelin mukauttaminen tehdään Pythonissa.

Yksi asia, jonka haluat todennäköisesti tehdä, on mukauttaa kehotetta. Voit tehdä tämän määrittämällä luettelon PROMPT-muuttujalle. Jos esimerkiksi haluat kehotteen olevan nykyinen hakemisto, joka tulostetaan vihreällä ja sen jälkeen sinisellä >:

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

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

Tämä korvaa selvittämättömän PS1-kokoonpanon, joka sinun on tehtävä bashissa. Color(0, 4, 0) määrittää vihreän, (argumentit ovat RGB-arvoja, välillä 0-5). PWD on ympäristömuuttuja, joka edustaa nykyistä hakemistoasi ja lisää tämän muuttujan eteen lambda: luo funktion, joka arvioidaan aina, kun kehote näytetään.

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

from math import *

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

Huomaa, että pi on suluissa. Yleensä marcel käyttää sulkeita Python-lausekkeiden rajaamiseen. Joten (pi) arvioi Python-lausekkeen, joka noutaa muuttujan pi arvon. Näin pääset käsiksi myös perinteisiin ympäristömuuttujiin, esim. (USER) ja (HOME) tai mikä tahansa kelvollinen Python-lauseke, joka perustuu marcelin nimiavaruuden symboleihin.

Ja voit tietysti määritellä omat symbolisi. Jos esimerkiksi laitat tämän funktion määritelmän tiedostoon ~/.marcel.py:

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

sitten voit käyttää komentorivillä factorial-funktiota, esim.

Marcel Shell esimerkkejä

Täällä opimme joitakin esimerkkejä marcel-kuoren komennoista.

Etsi tiedostokoot laajennuksen mukaan

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

Voit tehdä tämän marcelissa seuraavasti:

ls-operaattori tuottaa tiedosto-objektien virran (-fr tarkoittaa hakemistoissa käymistä rekursiivisesti ja vain tiedostojen palauttamista).

Tiedosto-objektit ohjataan seuraavaan komentoon, map. Map määrittää uloimmissa suluissa olevan Python-funktion, joka yhdistää jokaisen tiedoston monikkoon, joka sisältää tiedoston tunnisteen ja koon. (Marcel sallii lambda-avainsanan jättämisen pois.)

punainen (pienennä) -operaattori ryhmittelee monikon ensimmäisen osan mukaan (laajennus) ja laskee sitten yhteen kunkin ryhmän koot. Tulos lajitellaan laajennuksen mukaan.

Isäntä Executables ja Marcel Pipeline

Pielilinjat voivat sisältää yhdistelmän marcel-operaattoreita ja isäntäsuoritustiedostoja. Operaattorit pitävät objektit, mutta operaattorin/suoritettavan ohjelman rajoilla marcel putoaa merkkijonoja.

Tämä komento esimerkiksi yhdistää operaattorit ja suoritettavat tiedostot ja luettelee niiden käyttäjien käyttäjänimet, joiden komentotulkki on /bin/bash.

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

cat on Linuxin suoritettava ohjelma. Se lukee /etc/passwd ja marcel ohjaa sen sisällön alavirtaan marcel-operaattorikartalle.

Suluissa oleva kartoitusargumentti on Python-funktio, joka jakaa rivit :-erottimen kohdalta, jolloin saadaan 7 monikkoa. select on marcel-operaattori, jonka argumentti on Python-funktio, joka tunnistaa ne monikot, joiden viimeinen kenttä on /bin/bash.

Seuraava operaattori, toinen kartta säilyttää jokaisen syötetuplen käyttäjätunnuskentän. Lopuksi xargs echo yhdistää saapuvat käyttäjänimet yhdeksi riviksi, joka tulostetaan stdout-tiedostoon.

Käsikirjoitus Marcel Shellissä

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

Marcelin lähestymistapa on tarjota moduuli, joka integroi marcel-operaattorit Pythonin kieliominaisuuksiin. Jos haluat palata aikaisempaan esimerkkiin, tässä on Python-koodi tiedostokokojen summan laskemiseksi laajennuksen mukaan:

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

Shell-komennot ovat samat kuin ennenkin, lukuun ottamatta syntaktisia sopimuksia. Joten ls -fr muuttuu muotoon ls(file=True, recursive=True). Kartta ja punaiset operaattorit ovat myös siellä kytkettyinä putkilla, kuten kuoriversiossa. Koko komentotulkkikomento (ls … red) tuottaa Python-iteraattorin, jotta komentoa voidaan käyttää Pythonin silmukan kanssa.

Tietokannan käyttö Marcel Shellin avulla

Voit integroida tietokannan käytön marcel-putkistojen kanssa. Ensin sinun on määritettävä tietokannan käyttö konfiguraatiotiedostossa ~/.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-ohjaimen avulla. Yhteydet marcelista muodostetaan jao-käyttäjän avulla ja tietokantaprofiilin nimi on jao. (DB_DEFAULT määrittää jao-tietokantaprofiilin käytettäväksi, jos profiilia ei ole määritetty.) Kun tämä konfigurointi on tehty, tietokannasta voidaan nyt tehdä kyselyjä käyttämällä sql-operaattoria, esim.

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

Tämä komento tekee kyselyn taulukosta nimeltä part ja siirtää kyselyn tuloksen tiedostoon ~/reorder.csv CSV-muodossa.

Etäkäyttö Marcel Shellin avulla

Tietokannan käytön tapaan etäkäyttö voidaan määrittää osoitteessa ~/.marcel.py. Tämä esimerkiksi 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 laboratorioksi marcel-komennoissa. Käyttäjä- ja identiteettiparametrit määrittävät kirjautumistiedot ja host-parametri määrittää klusterin solmujen IP-osoitteet.

Kun klusteri on määritetty, kaikkia solmuja voidaan käyttää kerralla. Jos haluat esimerkiksi saada luettelon prosessin pidistä ja komentoriveistä klusterin kautta:

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

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

Lisätietoja on osoitteessa:

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

Marcel on melko uusi ja sitä kehitetään aktiivisesti. Ota yhteyttä jos haluat auttaa.