Marcel: un shell más moderno para Linux

Marcel: un shell más moderno para Linux

Marcel. es un nuevo caparazón. Es similar a los shells tradicionales en muchos aspectos, pero hace algunas cosas de manera diferente:

  • Tuberías. todas las shells usan tuberías para enviar un texto desde la salida de una comando a la entrada de otro. Marcel canaliza datos estructurados en lugar de cadenas.
  • Python. Marcel está implementado en Python y expone Python de varias formas. Si necesita un poco de lógica en sus comandos, marcel le permite expresarlo en Python.
  • Secuencias de comandos. Marcel adopta un enfoque inusual para las secuencias de comandos. Por supuesto, puede simplemente escribir una secuencia de comandos de marcel en un archivo de texto y ejecutarlos. Pero Marcel también proporciona una API en forma de módulo Python. Puede importar este módulo para realizar secuencias de comandos de Python de una manera mucho más conveniente de lo que es posible con Python simple.

Marcel. tiene licencia de GPLv3.

Instalación de Marcel Modern Shell en Linux

Marcel requiere Python 3.6. o posterior. Se ha desarrollado y probado en Linux y, sobre todo, funciona en macOS. (Si desea ayudar a portar a Windows. o solucionar las deficiencias de macOS. comuníquese con nosotros).

Para instalar marcel. para su propio uso:

# python3-m pip install marcel

O si desea instalar para todos los usuarios (por ejemplo, en/usr/local):

$ sudo python3-m pip install–prefix/usr/local marcel freestar.config.enabled_slots.push

Una vez que haya instalado marcel. verifique que esté funcionando ejecutando el comando marcel. y luego en el indicador marcel. ejecute el comando versión.

$ marcel  Verificar la versión de Marcel Shell  Verificar la versión de Marcel Shell Verificar la versión de Marcel Shell

Personalización de Marcel Shell

Puede personalizar marcel. en el archivo ~/.marcel.py, que se lee al inicio (y se vuelve a leer cuando se modifica). Como puede ver por el nombre del archivo, la personalización de marcel se realiza en Python.

Una cosa que probablemente desee hacer es personalizar el indicador. Para hacer esto, asigne una lista a la variable PROMPT. Por ejemplo, si desea que su mensaje sea el directorio actual, impreso en verde, seguido de> impreso en azul:

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

El mensaje resultante se ve así:

Cambiar el color del mensaje de Marcel Shell Cambiar el color del mensaje de Marcel Shell Cambiar el color del mensaje de Marcel Shell

Esto reemplaza la inescrutable configuración de PS1 que necesitaría hacer en bash. Color (0, 4, 0). especifica verde. (los argumentos son valores RGB. en el rango 0-5 ). PWD es la variable de entorno que representa su directorio actual y antepone lambda a esta variable: genera una función, que se evalúa cada vez que se muestra el indicador.

El ~/.marcel.py también puede importar módulos de Python. Por ejemplo, si desea utilizar las funciones del módulo matemático en sus comandos marcel:

desde la importación matemática *

Una vez que haya hecho esto, puede consultar los símbolos de ese módulo, p. Ej. Pi:

 Marcel Shell Symbols  Símbolos de Marcel Shell Símbolos de Marcel Shell

Tenga en cuenta que pi está entre paréntesis. En general, marcel. usa paréntesis para delimitar las expresiones de Python. Entonces (pi) evalúa la expresión de Python que recupera el valor de la variable pi. También puede acceder a las variables de entorno tradicionales de esta manera, p. Ej. (USUARIO). y (INICIO). o cualquier expresión de Python válida que se base en símbolos en el espacio de nombres de marcel.

Y, por supuesto, puede definir su propios símbolos. Por ejemplo, si pones esta definición de función en ~/.marcel.py:

def factorial (n): f = 1 para i en el rango (1, n + 1): f * = i return f

entonces puede usar la función factorial en la línea de comando, por ejemplo,

 Cree sus propios símbolos en Marcel  Cree sus propios símbolos en Marcel Crear símbolos propios en Marcel

Ejemplos de Shell de Marcel

Aquí, aprenderemos algunos ejemplos de comandos en el shell marcel.

Buscar tamaños de archivo por extensión

Explore el directorio actual de forma recursiva, agrupe los archivos por su extensión (p. ej. .txt, .py, etc.) y calcule el tamaño total del archivo para cada grupo.

Puede hacer esto en marcel de la siguiente manera:

 Buscar tamaños de archivo por extensión  Buscar tamaños de archivo por extensión Buscar tamaños de archivo por extensión

El operador ls produce una secuencia de objetos de archivo, (-fr significa visitar directorios de forma recursiva, y devolver solo archivos).

Los objetos Archivo. se canalizan al siguiente comando, map. El mapa. especifica una función de Python, en el paréntesis más externo, que asigna cada archivo a una tupla que contiene la extensión del archivo y su tamaño. (Marcel permite omitir la palabra clave lambda).

El operador rojo. (reducir) agrupa por la primera parte de la tupla ( extensión. y luego resuma los tamaños dentro de cada grupo. El resultado está ordenado por extensión.

Host Executables y Marcel Pipeline

Pipelines. pueden contener una mezcla de operadores marcel y ejecutables host. Los operadores canalizan objetos, pero en los límites del operador/ejecutable, marcel canaliza cadenas en su lugar.

Por ejemplo, este comando combina operadores y ejecutables y enumera los nombres de usuario de los usuarios cuyo shell es/bin/bash.

$ cat/etc/passwd \ | map (línea: line.split (‘:’)) \ | select (* línea: línea [-1] == ‘/bin/bash’) \ | map (* línea: línea [0]) \ | xargs echo  Lista de shells de usuario  Lista de shells de usuario Lista de shells de usuario

cat es un ejecutable de Linux. Lee /etc/passwd. y marcel canaliza su contenido hacia el mapa del operador de marcel.

El argumento entre paréntesis para map es una función de Python que divide las líneas en: separadores, produciendo 7 tuplas. Un select. es un operador marcel cuyo argumento es una función de Python que identifica aquellas tuplas en las que el último campo es /bin/bash.

El siguiente operador, otro mapa mantiene el campo de nombre de usuario de cada tupla de entrada. Finalmente, xargs echo. combina los nombres de usuario entrantes en una sola línea, que se imprime en la salida estándar.

Scripting en Marcel Shell

Mientras que Python. a veces se considera un lenguaje de secuencias de comandos, en realidad no funciona bien para ese propósito. El problema es que ejecutar comandos de shell y otros ejecutables de Python es engorroso. Puede usar os.system (), que es simple pero a menudo inadecuado para tratar con stdin, stdout y stderr. subprocess.Popen () es más poderoso pero más complejo de usar.

El enfoque de Marcel es proporcionar un módulo que integre los operadores de Marcel con las características del lenguaje Python. Para volver a visitar un ejemplo anterior, aquí está el código Python para calcular la suma de tamaños de archivo por extensión:

de marcel.api import * para ext, tamaño en (ls (file = True, recursive = True) | map ( lambda f: (f.suffix, f.size)) | red (‘.’, ‘+’)): print (f ‘ext: size)

Los comandos de shell son los mismos que antes, excepto por convenciones sintácticas. Entonces ls-fr se convierte en ls (archivo = Verdadero. recursivo = Verdadero). El mapa y los operadores rojos también están allí, conectados con tuberías, como en la versión de shell. Todo el comando de shell (ls … red). produce un iterador de Python para que el comando se pueda usar con Python para un bucle.

Acceso a la base de datos con Marcel Shell

Puede integrar el acceso a la base de datos con marcel pipelines. Primero, debe configurar el acceso a la base de datos en el archivo de configuración, ~/.marcel.py, por ejemplo,

define_db (name = ‘jao’, driver = ‘psycopg2’, dbname = ‘acme’, user = ‘jao’ ) DB_DEFAULT = ‘jao’

Esto configura el acceso a una base de datos de Postgres. llamada acme. usando el controlador psycopg2. Las conexiones desde marcel se realizarán utilizando el usuario jao. y el perfil de la base de datos se llamará jao. (DB_DEFAULT especifica el perfil de la base de datos jao. como el que se utilizará si no se especifica ningún perfil). Con esta configuración realizada, la base de datos ahora se puede consultar utilizando el operador sql, por ejemplo,

sql ‘ seleccione part_name, cantidad de la parte donde cantidad <10 '\ | out--csv –-file ~/reorder.csv

Este comando consulta una tabla llamada part. y descarga el resultado de la consulta en el archivo ~/reorder.csv, en formato CSV.

Acceso remoto con Marcel Shell

De manera similar al acceso a la base de datos, el acceso remoto se puede configurar en ~/.marcel.py. Por ejemplo, esto configura un clúster de 4 nodos:

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

El clúster se puede identificar como un laboratorio. en los comandos de marcel. Los parámetros de usuario e identidad especifican la información de inicio de sesión, y el parámetro host. especifica las direcciones IP de los nodos del clúster.

Una vez que el clúster está configurado, se pueden operar todos los nodos En seguida. Por ejemplo, para obtener una lista de pids. de proceso y líneas de comando en el clúster:

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

Esto devuelve un flujo de (dirección IP, PID, línea de comando) tuplas.