Marcel - En mere moderne skal til Linux


Marcel er en ny skal. Det ligner traditionelle skaller på mange måder, men det gør et par ting anderledes:

  • Rørledning: Alle skaller bruger rør til at sende en tekst fra output fra en kommando til input fra en anden. Marcel rør strukturerede data i stedet for strenge.
  • Python: Marcel implementeres i Python og udsætter Python på en række måder. Hvis du har brug for en smule logik i dine kommandoer, giver marcel dig mulighed for at udtrykke det i Python.
  • Scripting: Marcel tager en usædvanlig tilgang til scripting. Du kan selvfølgelig blot skrive en sekvens af marcel-kommandoer i en tekstfil og udføre dem. Men Marcel leverer også en API i form af et Python-modul. Du kan importere dette modul til at udføre Python-scripting på en langt mere bekvem måde end det er muligt med almindelig Python.

Marcel er licenseret under GPLv3.

Installation af Marcel Modern Shell i Linux

Marcel kræver Python 3.6 eller nyere. Det er blevet udviklet og testet på Linux, og det fungerer mest på macOS. (Hvis du gerne vil hjælpe med at porte til Windows eller rette op på macOS-manglerne, skal du kontakte.)

Sådan installeres marcel til eget brug:

# python3 -m pip install marcel

Eller hvis du vil installere for alle brugere (f.eks. Til /usr/local ):

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

Når du har installeret marcel, skal du kontrollere, at det fungerer ved at køre kommandoen marcel, og kør derefter versionskommandoen ved marcelprompten:

$ marcel

Tilpasning af Marcel Shell

Du kan tilpasse marcel i filen ~/.marcel.py , som læses ved opstart, (og læses igen, når den ændres). Som du kan se fra filens navn, foretages tilpasning af marcel i Python.

En ting, du sandsynligvis vil gøre, er at tilpasse prompten. For at gøre dette tildeler du en liste til PROMPT-variablen. Hvis du f.eks. Vil have din anmodning om at være den aktuelle mappe, trykt i grønt efterfulgt af > trykt i blåt:

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

Den resulterende prompt ser sådan ud:

Dette erstatter den ubeskrivelige PS1 -konfiguration, som du skal gøre i bash. Farve (0, 4, 0) angiver grøn (argumenterne er RGB-værdier, i området 0-5). PWD er den miljøvariabel, der repræsenterer din aktuelle mappe, og prefixet for denne variabel med lambda: genererer en funktion, der evalueres hver gang prompten vises.

~/.marcel.py kan også importere Python-moduler. Hvis du f.eks. Vil bruge funktionerne i matematikmodulet i dine marcel-kommandoer:

from math import *

Når du har gjort dette, kan du henvise til symboler fra dette modul, f.eks. pi :

Bemærk, at pi er parentes. Generelt bruger marcel parenteser til at afgrænse Python-udtryk. Så (pi) evaluerer Python-udtrykket, der henter værdien af variablen pi. Du kan også få adgang til traditionelle miljøvariabler på denne måde, f.eks. (BRUGER) og (HJEM) eller ethvert gyldigt Python-udtryk, der er afhængig af symboler i Marcels navneområde.

Og du kan selvfølgelig definere dine egne symboler. For eksempel, hvis du sætter denne funktionsdefinition i ~/.marcel.py :

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

så kan du bruge faktorfunktionen på kommandolinjen, f.eks.

Marcel Shell Eksempler

Her lærer vi nogle eksempler på kommandoer i marcelskallen.

Udforsk den aktuelle mappe rekursivt, gruppér filerne efter deres udvidelse (f.eks. .txt , .py og så videre), og bereg den samlede filstørrelse for hver gruppe.

Du kan gøre dette i marcel som følger:

Operatoren ls producerer en strøm af filobjekter ( -fr betyder besøg kataloger rekursivt og returnerer kun filer).

Filobjekterne ledes til den næste kommando, kort. Kortet specificerer en Python-funktion i de yderste parenteser, der kortlægger hver fil til en tuple, der indeholder filens udvidelse, og dens størrelse. (Marcel tillader, at lambda-nøgleordet udelades.)

Den røde (reducer) operator, grupperer efter den første del af tuplen (udvidelse) og opsummer derefter størrelserne inden for hver gruppe. Resultatet sorteres efter forlængelse.

Rørledninger kan indeholde en blanding af marceloperatører og værtseksekverbare filer. Operatører rør objekter, men ved operatørens/eksekverbare grænser strækker marcelrørene i stedet.

For eksempel kombinerer denne kommando operatorer og eksekverbare filer og viser brugernavne på brugere, hvis shell er /bin/bash .

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

cat er en Linux-eksekverbar. Det læser/etc/passwd, og marcel rør dets indhold nedstrøms til marceloperatørkortet.

Parentesargumentet for at kortlægge er en Python-funktion, der deler linierne ved : -separatorerne, hvilket giver 7-tupler. En select er en marceloperator, hvis argument er en Python-funktion, der identificerer de tupler, hvor det sidste felt er/bin/bash.

Den næste operatør, et andet kort, holder brugernavnet felt for hver input tuple. Endelig kombinerer xargs echo de indgående brugernavne i en enkelt linje, der udskrives til stdout.

Scripting i Marcel Shell

Mens Python undertiden betragtes som et scriptingsprog, fungerer det faktisk ikke godt til det formål. Problemet er, at kørende shell-kommandoer og andre eksekverbare filer fra Python er besværlige. Du kan bruge os.system() , hvilket er simpelt, men ofte utilstrækkeligt til at håndtere stdin, stdout og stderr. subprocess.Popen() er mere kraftfuld, men mere kompleks at bruge.

Marcels tilgang er at tilvejebringe et modul, der integrerer marceloperatører med Pythons sprogfunktioner. For at besøge et tidligere eksempel er her Python-koden til beregning af summen af filstørrelser ved udvidelse:

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

Skalkommandoer er de samme som før, bortset fra syntaktiske konventioner. Så ls -fr bliver til ls (file = True, recursive = True). Kortet og de røde operatører er der også, forbundet med rør, som i shellversionen. Hele shell-kommandoen (ls ... rød) giver en Python-iterator, så kommandoen kan bruges sammen med Pythons til en loop.

Databaseadgang med Marcel Shell

Du kan integrere databaseadgang med marcel-rørledninger. Først skal du konfigurere databaseadgang i konfigurationsfilen ~/.marcel.py , f.eks.

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

DB_DEFAULT = 'jao'

Dette konfigurerer adgang til en Postgres-database med navnet acme ved hjælp af psycopg2-driveren. Forbindelser fra marcel oprettes ved hjælp af jao-brugeren, og databaseprofilen hedder jao. (DB_DEFAULT specificerer jao-databaseprofilen som den, der skal bruges, hvis der ikke er angivet nogen profil.) Når denne konfiguration er udført, kan databasen nu forespørges ved hjælp af SQL-operatoren, f.eks.

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

Denne kommando forespørger en tabel, der hedder del, og dumper forespørgselsresultatet til filen ~/reorder.csv i CSV-format.

Fjernadgang med Marcel Shell

På samme måde som databaseadgang kan fjernadgang konfigureres i ~/.marcel.py . For eksempel konfigurerer dette en 4-node-klynge:

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

Klyngen kan identificeres som et laboratorium i marcel-kommandoer. Bruger- og identitetsparametrene angiver loginoplysninger, og værtsparameteren specificerer IP-adresserne på noderne i klyngen.

Når klyngen er konfigureret, kan alle noder betjenes på én gang. For eksempel for at få en liste over proces-pids og kommandolinjer på tværs af klyngen:

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

Dette returnerer en strøm af (IP-adresse, PID, kommandolinje) tupler.

For mere information besøg:

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

Marcel er ret ny og under aktiv udvikling. Kontakt os, hvis du gerne vil hjælpe.