Marcel - uma concha mais moderna para Linux
- 3994
- 29
- Maurice Champlin
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:
$ marcelVerifique 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 marcelIsso 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
:
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 MarcelExemplos 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ãoO 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 ecoListe 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.
- « Bashtop - Uma ferramenta de monitoramento de recursos para Linux
- Como criar equipes ou unidades da NIC no CentOS 8 / RHEL 8 »