Prefácio: Eu amo bash e não tenho intenção de iniciar qualquer tipo de argumento ou guerra santa, e espero que essa não seja uma pergunta extremamente ingênua.
Essa pergunta está um pouco relacionada a este post sobre superusuário, mas não acho que o OP realmente sabia o que estava pedindo. Eu uso o bash no FreeBSD, linux, OS X e cygwin no Windows. Também tive uma vasta experiência recentemente com o PowerShell no Windows.
Existe um shell para * nix, já disponível ou em andamento, compatível com o bash, mas que adiciona uma camada de script orientado a objetos ao mix? A única coisa que sei disso se aproxima é o console python, mas, tanto quanto posso dizer, não fornece acesso ao ambiente shell padrão. Por exemplo, eu não posso apenas cd ~
e ls
, em seguida, chmod +x file
dentro do console python. Eu precisaria usar o python para executar essas tarefas, em vez dos binários unix padrão, ou chamar os binários usando o código python.
Existe tal shell?
fonte
cd ~
seguidas dels
obras como no Bash. Você também pode atribuir saída a variáveis Python (listas de linhas. Mais ou menos) com comandos comolisting = !ls
.Respostas:
Eu posso pensar em três características desejáveis em um shell:
Os shells Unix tendem a se concentrar no aspecto interativo e subcontratam a maior parte do acesso ao sistema e parte da programação para ferramentas externas, como:
ftp
para FTPmail
,Mail
,mailx
, Etc. para o e-mail básicocron
para tarefas agendadasdbus-*
ou qdbus ) para várias tarefas de informações e configuração do sistema (incluindo ambientes de desktop modernos, como o KDE ≥4)Muitas coisas podem ser feitas invocando um comando com os argumentos corretos ou com a entrada canalizada. Essa é uma abordagem muito poderosa - é melhor ter uma ferramenta por tarefa que faça isso bem do que um único programa que faz tudo menos que mal - mas tem suas limitações.
Uma grande limitação dos shells unix, e suspeito que é isso que você procura com seu requisito de "script orientado a objetos", é que eles não são bons em reter informações de um comando para o próximo ou combinar comandos de maneiras mais sofisticadas do que um gasoduto. Em particular, a comunicação entre programas é baseada em texto; portanto, os aplicativos só podem ser combinados se eles serializarem seus dados de maneira compatível. Isso é uma bênção e uma maldição: a abordagem "tudo é texto" facilita a execução de tarefas simples rapidamente, mas aumenta a barreira para tarefas mais complexas.
A usabilidade interativa também funciona bastante contra a manutenção do programa. Os programas interativos devem ser curtos, exigir poucas citações, não incomodá-lo com declarações variáveis ou digitação, etc. é uma string, um nome de função, um nome de variável etc.), deve ter verificações de consistência, como declarações de variáveis e digitação, etc.
Em resumo, um shell é um compromisso difícil de alcançar. Ok, isso termina a seção de retórica, para os exemplos.
O Perl Shell (psh) "combina a natureza interativa de um shell Unix com o poder do Perl". Comandos simples (até pipelines) podem ser inseridos na sintaxe do shell; tudo o resto é Perl. O projeto não está em desenvolvimento há muito tempo. É utilizável, mas não chegou ao ponto em que eu consideraria usá-lo sobre o Perl puro (para script) ou o shell puro (interativamente ou para script).
O IPython é um console Python interativo aprimorado, especialmente direcionado à computação numérica e paralela. Este é um projeto relativamente jovem.
irb (ruby interativo) é o equivalente em Ruby do console do Python.
scsh é uma implementação de esquema (isto é, uma linguagem de programação decente) com o tipo de ligações do sistema tradicionalmente encontradas em shells unix (strings, processos, arquivos). No entanto, não pretende ser utilizável como um shell interativo.
O zsh é um shell interativo aprimorado. Seu ponto forte é a interatividade (edição de linha de comando, conclusão, tarefas comuns realizadas com sintaxe concisa mas enigmática). Seus recursos de programação não são tão bons (comparáveis ao ksh), mas vêm com várias bibliotecas para controle de terminal, regexps, rede etc.
fish é um começo limpo em uma concha no estilo unix. Não possui recursos melhores de programação ou acesso ao sistema. Por quebrar a compatibilidade com o sh, ele tem mais espaço para desenvolver recursos melhores, mas isso não aconteceu.
Adendo: outra parte da caixa de ferramentas unix está tratando muitas coisas como arquivos:
/sys
fornece mais controle de hardware e sistema./proc
sistema de arquivos.Talvez o futuro dos shells unix não seja um melhor acesso ao sistema por meio de comandos (e melhores estruturas de controle para combinar comandos), mas um melhor acesso ao sistema por meio de sistemas de arquivos (que se combinam de maneira um pouco diferente - acho que não descobrimos quais são os principais idiomas (como o tubo da carcaça) ainda estão).
fonte
Você não precisa de muito código bash para implementar classes ou objetos no bash.
Digamos, 100 linhas.
O Bash possui matrizes associativas que podem ser usadas para implementar um sistema de objetos simples com herança, métodos e propriedades.
Portanto, você pode definir uma classe como esta:
A criação de uma instância desta fila pode ser feita assim:
ou
Como as classes são implementadas com uma matriz, classe e inst são realmente sinônimos - como em javascript.
Adicionar itens a essa fila pode ser feito da seguinte maneira:
A remoção de itens em uma variável X pode ser feita assim:
E a estrutura de dumping de um objeto pode ser feita assim:
O que retornaria algo como isto:
As classes são criadas usando uma função de classe como esta:
NOTA: Ao definir uma nova classe ou instância, você pode substituir qualquer valor ou função de membro.
As matrizes associativas Bash têm uma peculiaridade que faz com que isso funcione perfeitamente: $ Q [0]} é idêntico a $ Q. Isso significa que podemos usar o nome do array para chamar uma função de despacho de método:
Uma desvantagem é que eu não posso usar [0] para dados, então minhas filas (neste caso) começam no índice = 1. Alternativamente, eu poderia ter usado índices associativos como "q + 0".
Para obter e definir membros, você pode fazer algo assim:
E para despejar uma estrutura de objeto, eu fiz isso:
NOTA: Isso não é necessário para o OOP no bash, mas é bom ver como os objetos são criados.
Meu design OOP não considerou objetos dentro de objetos - exceto para a classe herdada. Você pode criá-los separadamente ou criar um construtor especial como class (). * obj_dump * precisaria ser modificado para detectar classes internas para imprimi-las recursivamente.
Oh! e eu defino manualmente uma classe ROOT para simplificar a função da classe :
Com algumas funções de fila, defini algumas classes como esta:
Criou algumas instâncias da fila e as fez funcionar:
fonte
bash
é para isso. Lembra-me da resposta de Stephane sobre por que não usar loops de shell para processar texto, particularmente a seção "conceitualmente", que detalha a diferença de propósito entre idiomas como C ebash
. unix.stackexchange.com/a/169765/135943O ksh93t + está introduzindo alguns conceitos de OO, mantendo a sintaxe do shell bourne / posix: http://blog.fpmurphy.com/2010/05/ksh93-using-types-to-create-object-orientated-scripts.html
fonte
O IPython é surpreendentemente conveniente de usar.
Recursos padrão do shell: controle de tarefas, edição e histórico de linhas de leitura, aliases
cat
ls
cd
epwd
integração de pager, executando qualquer comando do sistema prefixando-o com um!
ou ativando%rehashx
, saída de comando atribuível a uma variável python, valores python disponíveis como variáveis do shell.Específico para Python: reutilizando resultados dos últimos comandos, acesso rápido à documentação e fonte, recarregamento de módulos, depurador. Algum suporte de cluster, se você gosta disso.
Dito isto, a execução de pipes complexos não é feita no Python; você também usará o shell posix, apenas com um pouco de cola para passar valores de um lado para o outro.
fonte
Tem o Rush, que usa ruby e Psh, que é baseado em perl.
fonte
jq
funciona muito bem como uma camada orientada a objetos.fonte
Este é um pouco mais simples de usar e configurar, nomeou args etc. https://github.com/uudruid74/bashTheObjects
Estou atualizando minha resposta com um exemplo, que segue um dos exemplos básicos dados para outra resposta, mas com esta sintaxe. O programa de exemplo é semelhante, mas você não precisa prefixar todas as variáveis com o nome da classe (ele sabe disso como mostra o método kindof ) e acho que a sintaxe é muito mais simples!
Primeiro, um arquivo de classe. Os padrões para as variáveis de instância são opcionais e usados apenas se você não passar esses valores para o construtor.
Agora, por exemplo, uso:
NOTAS:
Tecnicamente, a instrução de importação não é necessária, mas força o carregamento da classe no ponto especificado, em vez de aguardar a primeira novidade , o que pode ajudar a inicializar as coisas na ordem correta. Observe a facilidade com que você pode definir várias variáveis de instância de uma só vez.
Também existem níveis de depuração, construtores, destruidores, subclassificação e um sistema de reflexão básico , e é mostrado print / println para substituir o eco (tente imprimir uma variável que comece com um traço?). O exemplo no github mostra como sendo executado como CGI gerando HTML a partir de classes.
A biblioteca em si (oop.lib.sh) não é tão simples (mais de 400 linhas, 11K), mas você a inclui e a esquece.
fonte
Você pode instalar o PowerShell Core Edition no Linux agora. Ele é executado na estrutura .NET Core de plataforma cruzada, que está sendo ativamente desenvolvida pela Microsoft.
fonte
Se alguém quiser apenas o básico da programação orientada a objetos (propriedades e métodos), uma estrutura realmente simples seria suficiente.
Digamos que você queira exibir o texto "Hello World" usando objetos. Primeiro, você cria uma classe de objeto que possui uma propriedade para o texto a ser exibido e possui alguns métodos para definir e exibi-lo. Para mostrar como várias instâncias de uma classe podem funcionar juntas, adicionei dois métodos para exibir o texto: um com NewLine no final e outro sem isso.
Arquivo de definição de classe: EchoClass.class
Observe a palavra "<<Nome da instância>>". Isso será substituído posteriormente para criar várias instâncias de um objeto de classe. Antes de poder usar uma instância de um objeto, você precisa de uma função que realmente o crie. Para simplificar, será um script separado chamado: ObjectFramework.lib
Portanto, agora temos um arquivo de definição de classe e uma função CreateObject que cria uma cópia desse arquivo com o texto "<<InstanceName>>" substituído pelo nome que desejarmos.
Vamos usar nosso novo objeto em um script chamado: HelloWorld.sh (observe que HelloWorld.sh deve ser executável. Os outros dois arquivos não precisam)
Ao executar o script HelloWorld.sh, ele exibe o texto "Hello World" (e adiciona um NewLine). Ninguém ficará impressionado com este resultado, no entanto, saberemos que isso não é tão simples quanto parece :)
Feliz codificação!
fonte
Este é um shell orientado a objeto baseado em Python, mas possui uma sintaxe próxima ao Golang: https://github.com/alexst07/shell-plus-plus
Por exemplo, tente pegar:
sobrecarga de classe e operador:
e você pode usar os comandos bash semelhantes:
fonte
Agora, com quais objetos você está lidando com um shell na maioria das vezes? São arquivos / diretórios, processos e sua interação. Então deve gostar
f1.edit
ou algo assimcurrentFile=f1.c ; .edit ; .compile ; .run
. Ord1.search(filename='*.c' string='int \*')
. Oup1.stop
,p1.bg
. Essa é a minha compreensão de um Ooshell.fonte
apenas tentei introduzir oo conceitos para o bash com base na referência http://hipersayanx.blogspot.in/2012/12/object-oriented-programming-in-bash.html
fonte
Desculpe pela resposta curta, mas aqui vai.
hipersayanx criou um artigo Programação Orientada a Objetos no Bash . Basicamente, ele oi-levantado
$FUNCNAME
,function
,compgen
, eexport
para criar o mais próximo possível OOP pode-se entrar em bash.Parte legal é que funciona bem e é preciso apenas algumas linhas de caldeira para construir uma classe.
As peças básicas necessárias são:
Uso:
Agora, eu mesmo usei isso no meu projeto AuditOps e o hipersayanx tem mais detalhes sobre como isso realmente funciona em seu site. O aviso de tarifa, embora isso seja muito básico, não funcionará com nada mais antigo que o bash 4.0 e pode causar dor de cabeça na depuração. Enquanto pessoalmente, eu gostaria de ver a maior parte do revestimento da caldeira refeito como uma classe em si.
É sempre mais sensato usar uma linguagem de script OOP séria, como perl, ruby e python, quando melhor se adequar ao seu projeto. No entanto, na minha opção honesta, vale a pena o tempo e o esforço ao manter scripts bash modulares para utilizar esse método de OOP no bash.
fonte
Estou desenvolvendo no GitHub uma função que funciona exatamente como um objeto HashMap , shell_map .
Para criar " instâncias do HashMap ", essa função pode criar cópias de si mesma com nomes diferentes. Cada nova cópia de função terá uma variável $ FUNCNAME diferente. $ FUNCNAME é usado para criar um espaço para nome para cada instância do Mapa.
As chaves do mapa são variáveis globais, no formato $ FUNCNAME_DATA_ $ KEY, onde $ KEY é a chave adicionada ao mapa. Essas variáveis são variáveis dinâmicas .
Abaixo vou colocar uma versão simplificada para que você possa usar como exemplo.
Uso:
fonte
carp "Some error message"; return
.[ -z "$KEY" ] && { carp "some message"; return;}
Não há necessidade de um subshell. Mas, na verdade, isso parece um candidato real a umaif ... elif ... elif ... else ... fi
construção - o que geralmente não é a melhor escolha, mas provavelmente é aqui. :) (Ou talvez uma troca de maiúsculas e minúsculas).Plumbum é uma linguagem shell semelhante ao Python. Ele empacota shell como sintaxe com o Python, tornando a experiência orientada a objetos.
fonte