Por que existem vários shells em um sistema similar ao Unix?

14

Eu comecei aprendendo os fundamentos do Unix e me perguntando por que existem tantos shells em um sistema similar ao unix. Do livro Programação avançada no ambiente Unix :

A shell is a command-line interpreter that reads user input and executes commands.The user input to a shell is normally from the terminal (an interactive shell) or sometimes from a file (called a shell script).

E então o livro continua listando vários programas shell como Bourne shell, Bourne-again shell, Cshell, etc. Minha pergunta é basicamente por que precisamos de vários shells?

    
por Geek 29.11.2012 / 13:10

5 respostas

14

A maioria dos shells usados em ambientes UNIX modernos devem estar em conformidade com a especificação sh POSIX. O POSIX sh é derivado do shell Korn original (ksh88), que por sua vez é derivado do shell Bourne anterior, mas o POSIX sh especifica apenas um pequeno subconjunto da funcionalidade do mesmo ksh88. Um shell que apenas implementa o requisito mínimo não possui muitos recursos necessários para gravar todos os scripts, exceto os mais triviais, de uma maneira segura e razoável. Por exemplo, variáveis locais e matrizes são extras não padrão.

Portanto, o primeiro motivo é estender o shell com recursos extras. Escudos diferentes escolhem se concentrar em coisas diferentes. Por exemplo, Zsh se concentra em recursos interativos avançados, enquanto o ksh93 (o atual shell korn "original") se concentra em recursos e desempenho poderosos de programação. Até mesmo minúsculos shells como Dash adicionam pelo menos alguns extras não-padrão como variáveis locais.

Recursos extras raramente são amplamente interoperáveis. A maioria do conjunto de recursos do ksh88 é razoavelmente interoperável, como a sintaxe de globbing estendido, mas com recursos não padrão, não há garantias, e você deve saber realmente o que está fazendo para usá-los de maneira portátil.

O segundo motivo é legado. Ainda existem muitos Unixes proprietários que usam implementações não padrão antigas para seus / bin / sh. Até recentemente, o Solaris ainda usava Bourne como sua opção e optou por manter o shell Heirloom em vez de atualizar para algo moderno. Esses sistemas geralmente vêm com shells diferentes para os quais você pode alternar, por exemplo, alterando sua variável PATH ou alterando shebangs dentro de scripts individuais.

Então, para resumir. Existem vários shells, geralmente por padrão:

  • Para recursos extras, especialmente para lidar com extras não portáteis.
  • Para lidar com scripts herdados que geralmente não são mantidos.
  • tamanho / desempenho. Sistemas embarcados geralmente requerem pequenas conchas como mksh ou busybox sh.
  • Razões de licenciamento. AT & T ksh era um software proprietário até cerca de 2000 ou mais. Isso é basicamente o que deu origem a todos os clones semelhantes a ksh, como Zsh e Bash.
  • Outros motivos históricos. Embora não seja muito popular hoje em dia, houve tentativas radicais de redesenhar a linguagem, como o scsh e es. O recurso de substituição de processo de muitos shells vem originalmente do rc (com uma sintaxe diferente) e suporta a expansão do csh. Diferentes conchas têm diferentes combinações de tais recursos disponíveis, geralmente com algumas diferenças sutis ou não tão sutis.
por 29.11.2012 / 13:50
19

Porque as pessoas têm necessidades diferentes e é bom ter alternativas adequadas às suas necessidades na situação específica. Um shell é apenas uma ferramenta por si só e deve ser substituível por qualquer outro na minha opinião. Esse é o poder do Unix / Linux, em oposição ao que o Microsoft Windows escolheu para ser.

Da mesma forma ... Por que existem tantos editores de texto? Por que as pessoas desenvolvem um novo navegador se já existe um? Por que há o GNOME, o KDE, o Xfce, o LXDE, o E17, etc.?

    
por 29.11.2012 / 13:18
4

Resposta curta

Devido a um estranho histórico de licenciamento, nenhuma entidade única desenvolveu o Unix. Foi um processo comunitário em que tanto voluntários como corporações participaram. Essas entidades nem sempre compartilhavam todas as suas ferramentas, então shells separados aconteciam. Quando percebemos como isso é contraproducente, já era tarde demais para unificar todas as granadas em uso. Em vez disso, foi feito um trabalho para garantir que todas essas camadas sejam (teoricamente) compatíveis compatíveis entre si .

A resposta longa é complexa e está intimamente ligada à história do próprio Unix. Não há como manter uma única resposta nesta página, mas ela foi amplamente (mal) documentada. Você encontrará respostas mais detalhadas e precisas, examinando a Web e os livros que tratam da história do Unix.

    
por 29.11.2012 / 13:41
2

Diferentes shells existem pelos mesmos motivos que navegadores diferentes existem: todo mundo tem uma preferência, e alguns shells têm histórico de bagagem ou momentum. Cada um tem características e idiossincrasias diferentes.

    
por 29.11.2012 / 14:04
1

Principalmente, história ...

O Bourne foi desenvolvido como parte do (próprio) SysV Unix, enquanto o BSD usou csh ... Mais tarde, o bash foi desenvolvido como uma alternativa de código aberto ao shell Bourne (e suas versões aprimoradas, como o ksh). Uma concha semelhante a Bourne foi adotada no padrão POSIX. O ksh é compatível e o bash pode ser compatível.

Shells como csh e tcsh são muito mais fáceis de usar interativamente do que o shell Bourne original (que não tem conclusão de comando, etc) mas são horríveis para o script ...

Em alguns ambientes, como sistemas embarcados baseados em Unix, recursos de script, tamanho e velocidade são mais importantes que recursos interativos, como a conclusão de comandos, e uma variante diferente dos shells tendem a ser usados.

Para scripts portáteis, você deve usar uma variante Bourne compatível com POSIX e evitar extensões.

    
por 29.11.2012 / 13:52

Tags