Marcel - Ένα πιο σύγχρονο κέλυφος για Linux


Το Marcel είναι ένα νέο κέλυφος. Είναι παρόμοιο με τα παραδοσιακά κοχύλια από πολλές απόψεις, αλλά κάνει μερικά πράγματα διαφορετικά:

  • Σωληνώσεις: Όλα τα κελύφη χρησιμοποιούν σωλήνες για να στείλουν ένα κείμενο από την έξοδο μιας εντολής στην είσοδο μιας άλλης. Ο Marcel δίνει δομημένα δεδομένα αντί για συμβολοσειρές.
  • Python: Ο Marcel υλοποιείται στην Python και εκθέτει την Python με διάφορους τρόπους. Εάν χρειάζεστε λίγη λογική στις εντολές σας, το marcel σας επιτρέπει να το εκφράσετε σε Python.
  • Σενάριο: Ο Marcel ακολουθεί μια ασυνήθιστη προσέγγιση στο σενάριο. Μπορείτε, φυσικά, απλά να γράψετε μια ακολουθία εντολών marcel σε ένα αρχείο κειμένου και να τις εκτελέσετε. Αλλά ο Marcel παρέχει επίσης ένα API με τη μορφή μιας λειτουργικής μονάδας Python. Μπορείτε να εισαγάγετε αυτήν την ενότητα για να κάνετε δέσμες ενεργειών Python με πολύ πιο βολικό τρόπο από ό,τι είναι δυνατό με την απλή Python.

Το Marcel έχει άδεια σύμφωνα με το GPLv3.

Εγκατάσταση του Marcel Modern Shell στο Linux

Ο Marcel απαιτεί Python 3.6 ή νεότερη έκδοση. Έχει αναπτυχθεί και δοκιμαστεί σε Linux και λειτουργεί κυρίως σε macOS. (Αν θέλετε να βοηθήσετε τη μεταφορά σε Windows ή να διορθώσετε τις ελλείψεις του macOS, επικοινωνήστε.)

Για να εγκαταστήσετε το marcel για δική σας χρήση:

python3 -m pip install marcel

Ή εάν θέλετε να εγκαταστήσετε για όλους τους χρήστες (π.χ. σε /usr/local):

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

Αφού εγκαταστήσετε το marcel, ελέγξτε ότι λειτουργεί εκτελώντας την εντολή marcel και, στη συνέχεια, στη γραμμή εντολών marcel, εκτελέστε την έκδοση εντολή:

marcel

Προσαρμογή του Marcel Shell

Μπορείτε να προσαρμόσετε το marcel στο αρχείο ~/.marcel.py, το οποίο διαβάζεται κατά την εκκίνηση (και διαβάζεται ξανά όταν τροποποιείται). Όπως μπορείτε να καταλάβετε από το όνομα του αρχείου, η προσαρμογή του marcel γίνεται στην Python.

Ένα πράγμα που πιθανώς θέλετε να κάνετε είναι να προσαρμόσετε την προτροπή. Για να το κάνετε αυτό, εκχωρείτε μια λίστα στη μεταβλητή PROMPT. Για παράδειγμα, εάν θέλετε η προτροπή σας να είναι ο τρέχων κατάλογος, τυπωμένος με πράσινο χρώμα, ακολουθούμενος από > τυπωμένος με μπλε:

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

Η προτροπή που προκύπτει μοιάζει με αυτό:

Αυτό αντικαθιστά την ανεξερεύνητη διαμόρφωση PS1 που θα έπρεπε να κάνετε στο bash. Το Color(0, 4, 0) καθορίζει πράσινο, (τα ορίσματα είναι τιμές RGB, στην περιοχή 0-5 ισχυρή>). Το PWD είναι η μεταβλητή περιβάλλοντος που αντιπροσωπεύει τον τρέχοντα κατάλογό σας και προσθέτοντας το πρόθεμα αυτής της μεταβλητής με lambda: δημιουργεί μια συνάρτηση, η οποία αξιολογείται κάθε φορά που εμφανίζεται το μήνυμα.

Το ~/.marcel.py μπορεί επίσης να εισάγει λειτουργικές μονάδες Python. Για παράδειγμα, εάν θέλετε να χρησιμοποιήσετε τις συναρτήσεις της μαθηματικής ενότητας στις εντολές marcel:

from math import *

Αφού το κάνετε αυτό, μπορείτε να ανατρέξετε σε σύμβολα από αυτήν την ενότητα, π.χ. pi:

Σημειώστε ότι το pi βρίσκεται σε παρένθεση. Γενικά, το marcel χρησιμοποιεί παρενθέσεις για να οριοθετήσει εκφράσεις Python. Έτσι, το (pi) αξιολογεί την έκφραση Python που ανακτά την τιμή της μεταβλητής pi. Μπορείτε επίσης να έχετε πρόσβαση σε παραδοσιακές μεταβλητές περιβάλλοντος με αυτόν τον τρόπο, π.χ. (USER) και (HOME) ή οποιαδήποτε έγκυρη έκφραση Python που βασίζεται σε σύμβολα στον χώρο ονομάτων του marcel.

Και μπορείτε, φυσικά, να ορίσετε τα δικά σας σύμβολα. Για παράδειγμα, αν βάλετε αυτόν τον ορισμό συνάρτησης στο ~/.marcel.py:

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

τότε μπορείτε να χρησιμοποιήσετε την παραγοντική συνάρτηση στη γραμμή εντολών, π.χ.

Παραδείγματα Marcel Shell

Εδώ, θα μάθουμε μερικά παραδείγματα εντολών στο κέλυφος marcel.

Βρείτε μεγέθη αρχείων ανά επέκταση

Εξερευνήστε τον τρέχοντα κατάλογο αναδρομικά, ομαδοποιήστε τα αρχεία με βάση την επέκτασή τους (π.χ. .txt, .py και ούτω καθεξής) και υπολογίστε το συνολικό μέγεθος αρχείου για κάθε ομάδα.

Μπορείτε να το κάνετε αυτό στο marcel ως εξής:

Ο τελεστής ls παράγει μια ροή αντικειμένων Αρχείο, (-fr σημαίνει επίσκεψη καταλόγων αναδρομικά και επιστροφή μόνο αρχείων).

Τα αντικείμενα Αρχείο διοχετεύονται στην επόμενη εντολή, τον χάρτη. Ο χάρτης καθορίζει μια συνάρτηση Python, στην πιο εξωτερική παρένθεση, η οποία αντιστοιχίζει κάθε αρχείο σε μια πλειάδα που περιέχει την επέκταση του αρχείου και το μέγεθός του. (Ο Marcel επιτρέπει την παράλειψη της λέξης-κλειδιού λάμδα.)

Ο τελεστής κόκκινο (μείωση) ομαδοποιεί κατά το πρώτο μέρος της πλειάδας (επέκταση) και στη συνέχεια αθροίζει τα μεγέθη σε κάθε ομάδα. Το αποτέλεσμα ταξινομείται κατά επέκταση.

Host Executables και το Marcel Pipeline

Οι Pipelines ενδέχεται να περιέχουν ένα μείγμα τελεστών marcel και εκτελέσιμων αρχείων κεντρικού υπολογιστή. Οι χειριστές διοχετεύουν αντικείμενα, αλλά στα όρια χειριστή/εκτελέσιμα, αντ' αυτού, οι συμβολοσειρές σωλήνων marcel.

Για παράδειγμα, αυτή η εντολή συνδυάζει τελεστές και εκτελέσιμα και παραθέτει τα ονόματα χρήστη των χρηστών των οποίων το κέλυφος είναι /bin/bash.

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

Το cat είναι ένα εκτελέσιμο Linux. Διαβάζει /etc/passwd και το marcel διοχετεύει το περιεχόμενό του κατάντη προς τον χάρτη χειριστή marcel.

Το όρισμα σε παρένθεση για τη χαρτογράφηση είναι μια συνάρτηση Python που χωρίζει τις γραμμές στα διαχωριστικά :, δίνοντας 7-πλειάδες. Ο select είναι ένας τελεστής marcel του οποίου το όρισμα είναι μια συνάρτηση Python που προσδιορίζει εκείνες τις πλειάδες στις οποίες το τελευταίο πεδίο είναι /bin/bash.

Ο επόμενος τελεστής, ένας άλλος χάρτης διατηρεί το πεδίο ονόματος χρήστη κάθε πλειάδας εισόδου. Τέλος, το xargs echo συνδυάζει τα εισερχόμενα ονόματα χρήστη σε μία γραμμή, η οποία εκτυπώνεται σε stdout.

Σενάριο σε Marcel Shell

Ενώ η Python θεωρείται μερικές φορές ως γλώσσα σεναρίου, στην πραγματικότητα δεν λειτουργεί καλά για αυτόν τον σκοπό. Το πρόβλημα είναι ότι η εκτέλεση εντολών φλοιού και άλλων εκτελέσιμων από την Python είναι δυσκίνητη. Μπορείτε να χρησιμοποιήσετε το os.system(), το οποίο είναι απλό αλλά συχνά ανεπαρκές για την αντιμετώπιση των stdin, stdout και stderr. Το subprocess.Popen() είναι πιο ισχυρό αλλά πιο περίπλοκο στη χρήση.

Η προσέγγιση του Marcel είναι να παρέχει μια ενότητα που ενσωματώνει τους τελεστές marcel με τα χαρακτηριστικά γλώσσας της Python. Για να ξαναδούμε ένα προηγούμενο παράδειγμα, εδώ είναι ο κώδικας Python για τον υπολογισμό του αθροίσματος των μεγεθών αρχείων κατά επέκταση:

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

Οι εντολές του φλοιού είναι οι ίδιες με πριν, εκτός από τις συντακτικές συμβάσεις. Έτσι το ls -fr μετατρέπεται σε ls(file=True, recursive=True). Ο χάρτης και οι κόκκινοι χειριστές είναι επίσης εκεί, συνδεδεμένοι με σωλήνες, όπως στην έκδοση του κελύφους. Ολόκληρη η εντολή φλοιού (ls … κόκκινο) αποδίδει έναν επαναλήπτη Python έτσι ώστε η εντολή να μπορεί να χρησιμοποιηθεί με την Python για έναν βρόχο.

Πρόσβαση σε βάση δεδομένων με Marcel Shell

Μπορείτε να ενσωματώσετε την πρόσβαση στη βάση δεδομένων με αγωγούς marcel. Αρχικά, πρέπει να διαμορφώσετε την πρόσβαση στη βάση δεδομένων στο αρχείο διαμόρφωσης, ~/.marcel.py, π.χ.

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

DB_DEFAULT = 'jao'

Αυτό διαμορφώνει την πρόσβαση σε μια βάση δεδομένων Postgres με το όνομα acme, χρησιμοποιώντας το πρόγραμμα οδήγησης psycopg2. Οι συνδέσεις από το marcel θα γίνονται χρησιμοποιώντας τον χρήστη jao και το προφίλ της βάσης δεδομένων ονομάζεται jao. (Το DB_DEFAULT καθορίζει το προφίλ βάσης δεδομένων jao ως αυτό που θα χρησιμοποιηθεί εάν δεν έχει καθοριστεί προφίλ.) Με αυτήν τη ρύθμιση παραμέτρων, μπορείτε τώρα να αναζητήσετε τη βάση δεδομένων χρησιμοποιώντας τον τελεστή sql, π.χ.

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

Αυτή η εντολή υποβάλλει ερώτημα σε έναν πίνακα με το όνομα part και απορρίπτει το αποτέλεσμα του ερωτήματος στο αρχείο ~/reorder.csv, σε μορφή CSV.

Απομακρυσμένη πρόσβαση με Marcel Shell

Ομοίως με την πρόσβαση στη βάση δεδομένων, η απομακρυσμένη πρόσβαση μπορεί να διαμορφωθεί στο ~/.marcel.py. Για παράδειγμα, αυτό διαμορφώνει ένα σύμπλεγμα 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'])

Το σύμπλεγμα μπορεί να αναγνωριστεί ως εργαστήριο στις εντολές marcel. Οι παράμετροι χρήστη και ταυτότητας καθορίζουν τις πληροφορίες σύνδεσης και η παράμετρος host καθορίζει τις διευθύνσεις IP των κόμβων στο σύμπλεγμα.

Μόλις διαμορφωθεί το σύμπλεγμα, όλοι οι κόμβοι μπορούν να λειτουργήσουν ταυτόχρονα. Για παράδειγμα, για να λάβετε μια λίστα με pids διαδικασίας και γραμμές εντολών σε όλο το σύμπλεγμα:

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

Αυτό επιστρέφει μια ροή πλειάδων (διεύθυνση IP, PID, γραμμή εντολών).

Για περισσότερες πληροφορίες επισκεφθείτε:

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

Το Marcel είναι αρκετά νέο και υπό ενεργό ανάπτυξη. Επικοινωνήστε αν θέλετε να βοηθήσετε.