Marcel - une coque plus moderne pour Linux

Marcel - une coque plus moderne pour Linux

Marcel est une nouvelle coquille. Il est similaire aux coquilles traditionnelles à bien des égards, mais il fait quelques choses différemment:

  • Tuyauterie: Tous les shells utilisent des tuyaux pour envoyer un texte à partir de la sortie d'une commande à l'entrée d'un autre. Marcel Pipes structurés des données au lieu des chaînes.
  • Python: Marcel est implémenté dans Python et expose Python de plusieurs façons. Si vous avez besoin d'un peu de logique dans vos commandes, Marcel vous permet de l'exprimer en Python.
  • Script: Marcel adopte une approche inhabituelle des scripts. Vous pouvez, bien sûr, écrire simplement une séquence de commandes Marcel dans un fichier texte et les exécuter. Mais Marcel fournit également une API sous la forme d'un module Python. Vous pouvez importer ce module pour effectuer des scripts Python d'une manière bien plus pratique que possible avec Plain Python.

Marcel est licencié sous Gplv3.

Installation de Marcel Modern Shell en Linux

Marcel nécessite Python 3.6 ou plus tard. Il a été développé et testé sur Linux, et il fonctionne surtout sur macos. (Si vous souhaitez aider le port les fenêtres, ou pour réparer le macos lacunes, contactez.)

À installer marcel pour votre propre usage:

# python3 -m pip install marcel 

Ou si vous souhaitez installer pour tous les utilisateurs (E.g., pour / usr / local):

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

Une fois que vous avez installé marcel, Vérifiez que cela fonctionne en exécutant la commande marcel, Et puis au marcel Invite, exécutez le version commande:

$ marcel 
Vérifiez la version Shell Marcel

Personnalisation de Marcel Shell

Vous pouvez personnaliser marcel dans le fichier ~ /.marcel.py, qui est lu au démarrage (et relier lorsqu'il est modifié). Comme vous pouvez le voir à partir du nom du fichier, la personnalisation de Marcel se fait à Python.

Une chose que vous voulez probablement faire est de personnaliser l'invite. Pour ce faire, vous attribuez une liste à la RAPIDE variable. Par exemple, si vous voulez que votre invite soit le répertoire actuel, imprimé en vert, suivi de > Imprimé en bleu:

Invite = [Color (0, 4, 0), Lambda: Pwd, couleur (0, 2, 5), '>'] 

L'invite résultante ressemble à ceci:

Modifier la couleur de l'invite de la coque Marcel

Cela remplace l'inscrutable PS1 Configuration que vous devrez faire à Bash. Couleur (0, 4, 0) spécifier vert, (Les arguments sont RVB valeurs, dans la plage 0-5). PWD est la variable d'environnement représentant votre répertoire actuel et préfixant cette variable avec lambda: génère une fonction, évaluée à chaque fois que l'invite est affichée.

Le ~ /.marcel.py peut également importer des modules python. E.g., Si vous souhaitez utiliser les fonctions du module mathématique dans vos commandes Marcel:

de l'importation mathématique * 

Une fois que vous avez fait cela, vous pouvez vous référer aux symboles de ce module, e.g. pi:

Symboles de la coquille Marcel

Noter que pi est parenthésisé. En général, marcel utilise des parenthèses pour délimiter les expressions Python. Donc (pi) évalue l'expression python qui récupère la valeur de la variable pi. Vous pouvez également accéder aux variables d'environnement traditionnelles de cette manière, e.g. (UTILISATEUR) et (MAISON), ou toute expression python valide s'appuyant sur des symboles dans l'espace de noms de Marcel.

Et vous pouvez, bien sûr, définir vos propres symboles. Par exemple, si vous mettez cette définition de fonction dans ~ /.marcel.py:

def factoriel (n): f = 1 pour i dans la plage (1, n + 1): f * = je retourne f 

Ensuite, vous pouvez utiliser la fonction factorielle sur la ligne de commande, E.g.

Créer ses propres symboles à Marcel

Exemples de shell Marcel

Ici, nous apprendrons quelques exemples de commandes dans le shell Marcel.

Trouver des tailles de fichiers par extension

Explorez le répertoire actuel récursivement, regroupez les fichiers par leur extension (e.g. .SMS, .py et ainsi de suite), et calculez la taille totale du fichier pour chaque groupe.

Vous pouvez le faire à Marcel comme suit:

Trouver des tailles de fichiers par extension

L'opérateur LS produit un flux d'objets de fichier ((-frousser signifie visiter les répertoires récursivement et retourner uniquement les fichiers).

Le Déposer Les objets sont tuaux à la commande suivante, map. Le carte Spécifie une fonction Python, dans les parenthèses les plus externes, qui mappe chaque fichier à un tuple contenant l'extension du fichier, et sa taille est. (Marcel permet d'omettre le mot-clé lambda.)

Le rouge (réduire) l'opérateur, groupes par la première partie du tuple (extension) puis résumer les tailles au sein de chaque groupe. Le résultat est trié par extension.

Executiles d'hôte et le pipeline Marcel

Pipelines Peut contenir un mélange d'opérateurs Marcel et d'images hôtes. Opérateurs Pipe Objectts, mais aux limites de l'opérateur / exécutable, Marcel Pipes Instructions à la place.

Par exemple, cette commande combine des opérateurs et des exécutables et répertorie les noms d'utilisateur des utilisateurs dont le shell est / bac / bash.

$ cat / etc / passwd \ | Carte (ligne: ligne.Split (':')) \ | SELECT (* LINE: LINE [-1] == '/ bin / bash') \ | map (* ligne: ligne [0]) \ | xargs écho 
Répertorier les shells utilisateur

Cat est un exécutable Linux. Ça lit / etc / passwd, et Marcel tue son contenu en aval à la carte de l'opérateur de Marcel.

L'argument entre parenthèse à mapper est une fonction Python qui divise les lignes au niveau du : séparateurs, produisant 7-tuples. UN sélectionner est un opérateur Marcel dont l'argument est une fonction python identifiant les tuples dans lesquels le dernier champ est / bac / bash.

L'opérateur suivant, une autre carte conserve le champ de nom d'utilisateur de chaque tuple d'entrée. Enfin, xargs écho combine les noms d'utilisateur entrants en une seule ligne, qui est imprimée sur stdout.

Script dans Marcel Shell

Alors que Python est parfois considéré comme un langage de script, il ne fonctionne pas bien à cette fin. Le problème est que l'exécution des commandes de shell et d'autres exécutables de Python est lourd. Vous pouvez utiliser OS.système(), ce qui est simple mais souvent inadéquat pour traiter avec stdin, stdout et stderr. sous-processus.POPEN () est plus puissant mais plus complexe à utiliser.

L'approche de Marcel consiste à fournir un module qui intègre les opérateurs de Marcel avec les fonctionnalités linguistiques de Python. Pour revisiter un exemple précédent, voici le code Python pour calculer la somme des tailles de fichiers par extension:

de Marcel.API Import * pour ext, taille dans (ls (file = true, récursif = true) | map (lambda f: (f.suffixe, f.taille)) | rouge('.',' + ')): print (f' ext: size) 

Les commandes de shell sont les mêmes qu'auparavant, à l'exception des conventions syntaxiques. Donc ls -fr se transforme en LS (fichier = true, récursif = vrai). La carte et les opérateurs rouges sont également là, connectés à des tuyaux, comme dans la version shell. Toute la commande shell (ls… rouge) donne un itérateur Python afin que la commande puisse être utilisée avec Python pour une boucle.

Accès à la base de données avec Marcel Shell

Vous pouvez intégrer l'accès à la base de données avec les pipelines Marcel. Tout d'abord, vous devez configurer l'accès à la base de données dans le fichier de configuration, ~ /.marcel.py, e.g.

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

Cela configure l'accès à un Postgres base de données nommée acmé, en utilisant le psycopg2 conducteur. Les connexions de Marcel seront établies en utilisant le jao l'utilisateur, et le profil de la base de données est nommé jao. (Db_default spécifie le jao profil de base de données comme celui à utiliser si aucun profil n'est spécifié.) Avec cette configuration effectuée, la base de données peut désormais être interrogée à l'aide de l'opérateur SQL, E.g.

SQL 'select part_name, quantité dans la partie où < 10' \ | out --csv --file ~/reorder.csv 

Cette commande interroge une table nommée partie, et vide le résultat de la requête dans le fichier ~ / réorganiser.CSV, au format CSV.

Accès à distance avec Marcel Shell

De même pour l'accès à la base de données, l'accès à distance peut être configuré dans ~ /.marcel.py. Par exemple, cela configure un cluster à 4 nœuds:

Define_remote (name = 'lab', user = "Frankenstein", identité = "/ home / francenstein /.ssh / id_rsa ", hôte = ['10.0.0.100 ', '10.0.0.101 ', '10.0.0.102 ', '10.0.0.103 ']) 

Le cluster peut être identifié comme un laboratoire Dans les commandes de Marcel. Les paramètres de l'utilisateur et d'identité spécifient les informations de connexion et le héberger Le paramètre spécifie les adresses IP des nœuds sur le cluster.

Une fois le cluster configuré, tous les nœuds peuvent être utilisés en même temps. Par exemple, pour obtenir une liste de processus pides et les lignes de commande à travers le cluster:

@Lab [PS | Carte (Proc: (Proc.pid, proc.ligne de commande))] 

Cela renvoie un flux de tuples (adresse IP, PID, ligne de commande).

Pour plus d'informations, visitez:

  • https: // www.marcelheshell.org /
  • https: // github.com / géophile / marcel

Marcel est assez nouveau et sous le développement actif. Contacte si vous souhaitez aider.