Marcel - uma concha mais moderna para Linux

Marcel - uma concha mais moderna para Linux

Marcel é uma nova concha. É semelhante às conchas tradicionais de várias maneiras, mas faz algumas coisas de maneira diferente:

  • Tubulação: Todas as conchas usam tubos para enviar um texto da saída de um comando para a entrada de outro. Marcel Pipes estruturados dados em vez de strings.
  • Pitão: Marcel é implementado em Python e expõe Python de várias maneiras. Se você precisar de um pouco de lógica em seus comandos, Marcel permite que você o expresse em Python.
  • Script: Marcel adota uma abordagem incomum para os scripts. Você pode, é claro, simplesmente escrever uma sequência de comandos marcel em um arquivo de texto e executá -los. Mas Marcel também fornece uma API na forma de um módulo Python. Você pode importar este módulo para fazer scripts em python de uma maneira muito mais conveniente do que é possível com o Python simples.

Marcel está licenciado em GPLV3.

Instalando Marcel Modern Shell em Linux

Marcel exige Python 3.6 ou mais tarde. Foi desenvolvido e testado no Linux, e funciona principalmente em Mac OS. (Se você quiser ajudar a Port para janelas, ou para consertar o Mac OS Deficiências, entre em contato.)

Para instalar Marcel Para seu próprio uso:

# python3 -m pip install marcel 

Ou se você quiser instalar para todos os usuários (e.g., para /usr/local):

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

Depois de instalar Marcel, Verifique se está funcionando executando o comando Marcel, E então no Marcel rápido, execute o versão comando:

$ marcel 
Verifique a versão marcel shell

Personalização de Marcel Shell

Você pode personalizar Marcel no arquivo ~/.Marcel.py, que é lido na startup (e releira quando modificado). Como você pode dizer pelo nome do arquivo, a personalização de Marcel é feita em Python.

Uma coisa que você provavelmente quer fazer é personalizar o prompt. Para fazer isso, você atribui uma lista ao INCITAR variável. Por exemplo, se você deseja que seu aviso seja o diretório atual, impresso em verde, seguido por > Impresso em azul:

Prompt = [cor (0, 4, 0), lambda: pwd, cor (0, 2, 5), '>'] 

O prompt resultante se parece com o seguinte:

Alterar a cor do shell marcel

Isso substitui o inescrutável Ps1 Configuração que você precisaria fazer em Bash. Cor (0, 4, 0) Especifica verde, (Os argumentos são Rgb valores, no intervalo 0-5). PWD é a variável de ambiente que representa seu diretório atual e prefixando esta variável com Lambda: gera uma função, avaliada cada vez que o prompt é exibido.

O ~/.Marcel.py também pode importar módulos python. E.g., Se você deseja usar as funções do módulo de matemática em seus comandos Marcel:

da importação matemática * 

Depois de fazer isso, você pode se referir a símbolos desse módulo, e.g. pi:

Símbolos de Shell Marcel

Observe que pi é entre parênteses. Em geral, Marcel usa parênteses para delimitar expressões python. Então (pi) avalia a expressão python que recupera o valor da variável pi. Você também pode acessar variáveis ​​de ambiente tradicional dessa maneira, e.g. (DO UTILIZADOR) e (LAR), ou qualquer expressão válida de Python que depende de símbolos no espaço para nome de Marcel.

E você pode, é claro, definir seus próprios símbolos. Por exemplo, se você colocar esta definição de função em ~/.Marcel.py:

Def Fatorial (n): F = 1 para i no intervalo (1, n + 1): f *= eu retorno f 

Então você pode usar a função fatorial na linha de comando, e.g.

Criar símbolos próprios em Marcel

Exemplos de Shell Marcel

Aqui, aprenderemos alguns exemplos de comandos no marcel shell.

Encontre tamanhos de arquivo por extensão

Explore o diretório atual recursivamente, agrupe os arquivos por sua extensão (e.g. .TXT, .py e assim por diante) e calcule o tamanho total do arquivo para cada grupo.

Você pode fazer isso em Marcel da seguinte maneira:

Encontre tamanhos de arquivo por extensão

O operador LS produz um fluxo de objetos de arquivo ((-fr significa visitar os diretórios recursivamente e retornar apenas arquivos).

O Arquivo Objetos são canalizados para o próximo comando, mapa. O mapa Especifica uma função python, nos parênteses mais externos, que mapeia cada arquivo para uma tupla contendo a extensão do arquivo, e o tamanho é. (Marcel permite que a palavra -chave lambda seja omitida.)

O vermelho (redução) operador, grupos na primeira parte da tupla (extensão) e depois resumir os tamanhos dentro de cada grupo. O resultado é classificado por extensão.

Executáveis ​​host e o pipeline marcel

Pipelines pode conter uma mistura de operadores de marcel e executáveis ​​host. Operadores Pipe objetos, mas nos limites do operador/executável, Marcel Pipes Strings.

Por exemplo, este comando combina operadores e executáveis ​​e lista os nomes de usuário dos usuários cujo shell é /BIN/BASH.

$ cat /etc /passwd \ | mapa (linha: linha.Split (':')) \ | Selecione (*Linha: Linha [-1] == '/Bin/Bash') \ | mapa (*linha: linha [0]) \ | Xargs eco 
Liste os shells de usuários

Cat é um executável do Linux. Ele lê /etc/passwd, e Marcel coloca seu conteúdo a jusante para o mapa do operador Marcel.

O argumento entre parênteses para mapear é uma função python que divide as linhas no : separadores, produzindo 7 tuplos. A Selecione é um operador Marcel cujo argumento é uma função python que identifica as tuplas em que o último campo é /BIN/BASH.

O próximo operador, outro mapa mantém o campo de nome de usuário de cada tupla de entrada. Finalmente, Xargs eco Combina os nomes de usuário recebidos em uma única linha, que é impressa para Stdout.

Scripts em marcel shell

Enquanto Pitão às vezes é considerado uma linguagem de script, na verdade não funciona bem para esse fim. O problema é que a execução de comandos do shell e outros executáveis ​​do Python é complicado. Você pode usar OS.sistema(), o que é simples, mas muitas vezes inadequado para lidar com stdin, stdout e stderr. subprocesso.Popen () é mais poderoso, mas mais complexo de usar.

A abordagem de Marcel é fornecer um módulo que integra os operadores Marcel com os recursos de linguagem do Python. Para revisitar um exemplo anterior, aqui está o código Python para calcular a soma dos tamanhos de arquivo por extensão:

de Marcel.Importação da API * para ext, tamanho em (ls (arquivo = true, recursivo = true) | mapa (lambda f: (f.sufixo, f.tamanho)) | vermelho('.','+')): print (f' ext: size) 

Os comandos do shell são os mesmos de antes, exceto para convenções sintáticas. Então ls -fr torna-se em ls (arquivo = true, recursivo = true). O mapa e os operadores vermelhos também estão lá, conectados com tubos, como na versão do shell. Todo o comando shell (LS… vermelho) produz um iterador de python para que o comando possa ser usado com o python para um loop.

Acesso ao banco de dados com marcel shell

Você pode integrar o acesso ao banco de dados com os pipelines Marcel. Primeiro, você precisa configurar o acesso ao banco de dados no arquivo de configuração, ~/.Marcel.py, e.g.

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

Isso configura o acesso a um PostGres banco de dados nomeado acme, usando o Psycopg2 motorista. As conexões de Marcel serão feitas usando o Jao Usuário e o perfil do banco de dados é nomeado Jao. (Db_default especifica o Jao Perfil do banco de dados como aquele a ser usado se nenhum perfil for especificado.) Com essa configuração feita, o banco de dados agora pode ser consultado usando o operador SQL, e.g.

SQL 'SELECT part_name, quantidade de parte onde a quantidade < 10' \ | out --csv --file ~/reorder.csv 

Este comando consulta uma tabela chamada papel, e despeja o resultado da consulta no arquivo ~/reordenar.CSV, No formato CSV.

Acesso remoto com marcel shell

Da mesma forma ao acesso ao banco de dados, o acesso remoto pode ser configurado em ~/.Marcel.py. Por exemplo, isso configura um cluster de 4 nós:

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

O cluster pode ser identificado como um laboratório nos comandos marcel. Os parâmetros de usuário e identidade especificam informações de login e o hospedar Parâmetro Especifica os endereços IP dos nós no cluster.

Depois que o cluster estiver configurado, todos os nós podem ser operados de uma só vez. Por exemplo, para obter uma lista de processo pids e linhas de comando através do cluster:

@lab [ps | mapa (Proc: (Proc.PID, Proc.linha de comando))] 

Isso retorna um fluxo de tuplas (endereço IP, PID, linha de comando).

Para mais informações visite:

  • https: // www.Marceltheshell.org/
  • https: // github.com/geophil/marcel

Marcel é bastante novo e sob desenvolvimento ativo. Entre em contato se quiser ajudar.