Marcel – modernesnis apvalkalas, skirtas Linux


Marcel yra naujas apvalkalas. Jis daugeliu atžvilgių panašus į tradicinius apvalkalus, tačiau kai kuriuos dalykus atlieka kitaip:

  • Vamzdžiai: visi apvalkalai naudoja vamzdžius tekstui iš vienos komandos išvesties siųsti į kitos komandos įvestį. Marcelas pateikia struktūrinius duomenis, o ne eilutes.
  • Python: Marcel yra įdiegtas Python ir atskleidžia Python įvairiais būdais. Jei komandose reikia šiek tiek logikos, marcel leidžia tai išreikšti Python.
  • Scenarijų kūrimas: Marcelis laikosi neįprasto požiūrio į scenarijus. Žinoma, galite tiesiog įrašyti marcel komandų seką į tekstinį failą ir jas vykdyti. Tačiau Marcel taip pat teikia API Python modulio pavidalu. Galite importuoti šį modulį ir atlikti Python scenarijus kur kas patogiau nei įmanoma naudojant paprastą Python.

Marcel licencijuota pagal GPLv3.

„Marcel Modern Shell“ diegimas sistemoje „Linux“.

Marcel reikalinga Python 3.6 arba naujesnė versija. Jis buvo sukurtas ir išbandytas sistemoje „Linux“ ir dažniausiai veikia su macOS. (Jei norite padėti perkelti į Windows arba pataisyti macOS trūkumus, susisiekite.)

Jei norite įdiegti marcel savo reikmėms:

python3 -m pip install marcel

Arba, jei norite įdiegti visiems naudotojams (pvz., į /usr/local):

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

Įdiegę marcel, patikrinkite, ar jis veikia, vykdydami komandą marcel, o tada ragindami marcel paleiskite versiją komanda:

marcel

Marcel Shell pritaikymas

Galite tinkinti marcel faile ~/.marcel.py, kuris nuskaitomas paleidžiant (ir perskaitomas pakeitus). Kaip galite suprasti iš failo pavadinimo, „Marcel“ tinkinimas atliekamas „Python“.

Vienas dalykas, kurį tikriausiai norite padaryti, yra pritaikyti raginimą. Norėdami tai padaryti, kintamajam PROMPT priskiriate sąrašą. Pavyzdžiui, jei norite, kad raginimas būtų dabartinis katalogas, atspausdintas žaliai, o po to > būtų atspausdintas mėlyna spalva:

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

Gautas raginimas atrodo taip:

Tai pakeičia nesuprantamą PS1 konfigūraciją, kurią turėtumėte atlikti naudojant bash. Spalva(0, 4, 0) nurodo žalia (argumentai yra RGB reikšmės, diapazone 0–5). PWD yra aplinkos kintamasis, vaizduojantis jūsų dabartinį katalogą ir prieš šį kintamąjį įtraukus lambda:, sukuriama funkcija, įvertinama kiekvieną kartą, kai rodomas raginimas.

~/.marcel.py taip pat gali importuoti Python modulius. Pvz., jei norite naudoti matematikos modulio funkcijas savo marcel komandose:

from math import *

Kai tai padarysite, galėsite remtis simboliais iš to modulio, pvz. pi:

Atminkite, kad pi yra skliausteliuose. Paprastai marcel naudoja skliaustus, kad atskirtų Python išraiškas. Taigi (pi) įvertina Python išraišką, kuri nuskaito kintamojo pi reikšmę. Taip pat tokiu būdu galite pasiekti tradicinius aplinkos kintamuosius, pvz. (USER) ir (HOME) arba bet koks tinkamas „Python“ reiškinys, pagrįstas simboliais „Marcel“ vardų srityje.

Ir jūs, žinoma, galite apibrėžti savo simbolius. Pavyzdžiui, jei šią funkcijos apibrėžimą įdėjote į ~/.marcel.py:

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

tada komandinėje eilutėje galite naudoti faktorialinę funkciją, pvz.

Marcel Shell pavyzdžiai

Čia sužinosime keletą komandų pavyzdžių marcel apvalkale.

Raskite failų dydžius pagal plėtinį

Rekursyviai naršykite dabartinį katalogą, sugrupuokite failus pagal plėtinį (pvz., .txt, .py ir pan.) ir apskaičiuokite bendrą kiekvienos grupės failo dydį.

Tai galite padaryti „Marcel“ taip:

Operatorius ls sukuria failų objektų srautą (-fr reiškia rekursyviai aplankyti katalogus ir grąžinti tik failus).

Objektai Failas nukreipiami į kitą komandą – žemėlapį. Žemėlapyje atokiausiuose skliausteliuose nurodoma Python funkcija, kuri kiekvieną failą susieja su rinkiniu, kuriame yra failo plėtinys ir jo dydis. (Marselis leidžia praleisti raktinį žodį lambda.)

Operatorius raudonas (sumažinti) sugrupuoja pagal pirmąją eilės dalį (plėtinys), tada susumuoja kiekvienos grupės dydžius. Rezultatas rūšiuojamas pagal plėtinį.

Host Executables ir Marcel Pipeline

Konvejeriuose gali būti tiek „marcel“ operatorių, tiek prieglobos vykdomųjų failų. Operatoriai sujungia objektus, bet prie operatoriaus/vykdomojo failo ribų marcel vamzdžių eilutės.

Pavyzdžiui, ši komanda sujungia operatorius ir vykdomuosius failus bei pateikia vartotojų vardus, kurių apvalkalas yra /bin/bash.

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

cat yra Linux vykdomasis failas. Jis skaito /etc/passwd, o „Marcel“ perduoda turinį pasroviui į „Marcel“ operatoriaus žemėlapį.

Skliausteliuose esantis atvaizdavimo argumentas yra Python funkcija, kuri padalija eilutes prie : skyriklių, taip gaudama 7 eilutes. Select yra „Marcel“ operatorius, kurio argumentas yra „Python“ funkcija, identifikuojanti tuos eilutes, kurių paskutinis laukas yra /bin/bash.

Kitas operatorius, kitas žemėlapis išsaugo kiekvienos įvesties eilutės vartotojo vardo lauką. Galiausiai, xargs echo sujungia gaunamus naudotojų vardus į vieną eilutę, kuri išspausdinama į stdout.

Scenarijus Marcel Shell

Nors kartais manoma, kad Python yra scenarijų kalba, iš tikrųjų ji netinkamai veikia šiuo tikslu. Problema ta, kad apvalkalo komandų ir kitų vykdomųjų failų vykdymas iš Python yra sudėtingas. Galite naudoti os.system(), kuris yra paprastas, bet dažnai netinkamas dirbti su stdin, stdout ir stderr. subprocess.Popen() yra galingesnis, bet sudėtingesnis naudoti.

Marcel tikslas yra pateikti modulį, kuris integruoja marcel operatorius su Python kalbos funkcijomis. Jei norite peržiūrėti ankstesnį pavyzdį, čia yra Python kodas, skirtas apskaičiuoti failų dydžių sumą pagal plėtinį:

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

Apvalkalo komandos yra tokios pačios kaip ir anksčiau, išskyrus sintaksines konvencijas. Taigi ls -fr virsta ls(file=True, recursive=True). Taip pat yra žemėlapis ir raudoni operatoriai, sujungti vamzdžiais, kaip ir apvalkalo versijoje. Visa apvalkalo komanda (ls … red) suteikia „Python“ iteratorių, kad komandą būtų galima naudoti su „Python“ ciklu.

Prieiga prie duomenų bazės su Marcel Shell

Galite integruoti prieigą prie duomenų bazės su „Marcel“ vamzdynais. Pirmiausia turite sukonfigūruoti prieigą prie duomenų bazės konfigūracijos faile ~/.marcel.py, pvz.

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

DB_DEFAULT = 'jao'

Taip sukonfigūruojama prieiga prie Postgres duomenų bazės, pavadintos acme, naudojant psycopg2 tvarkyklę. Ryšiai iš marcel bus užmegzti naudojant jao vartotoją, o duomenų bazės profilis pavadintas jao. (DB_DEFAULT nurodo jao duomenų bazės profilį kaip tą, kuris bus naudojamas, jei profilis nenurodytas.) Atlikus šią konfigūraciją, duomenų bazėje dabar galima pateikti užklausą naudojant sql operatorių, pvz.

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

Ši komanda pateikia užklausą lentelėje, pavadintoje dal, ir CSV formatu užklausos rezultatą iškelia į failą ~/reorder.csv.

Nuotolinė prieiga su Marcel Shell

Panašiai kaip prieigą prie duomenų bazės, nuotolinę prieigą galima konfigūruoti ~/.marcel.py. Pavyzdžiui, taip sukonfigūruojamas 4 mazgų klasteris:

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

„Marcel“ komandose klasterį galima identifikuoti kaip laboratoriją. Vartotojo ir tapatybės parametrai nurodo prisijungimo informaciją, o parametras host – klasterio mazgų IP adresus.

Sukonfigūravus grupę, visus mazgus galima valdyti vienu metu. Pavyzdžiui, norėdami gauti procesų pids ir komandų eilučių sąrašą klasteryje:

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

Tai grąžina (IP adresas, PID, komandų eilutė) eilučių srautą.

Norėdami gauti daugiau informacijos, apsilankykite:

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

Marcel yra gana naujas ir aktyviai kuriamas. Susisiekite, jei norite padėti.