Por que existem várias conchas em um sistema como o Unix?

16

Eu apenas comecei a aprender os fundamentos do Unix e me pergunto por que existem tantas conchas em um sistema como o Unix. Do livro Programação Avançada no Ambiente Unix :

Um shell é um intérprete de linha de comando que lê a entrada do usuário e executa comandos. A entrada do usuário em um shell normalmente é do terminal (um shell interativo) ou, às vezes, de um arquivo (chamado de script do shell).

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

Nerd
fonte
4
A mesma razão pela qual existem tantos padrões para várias outras tecnologias se aplica. xkcd.com/927
Dan Neely
1
Pela mesma razão pela qual você pode ter compiladores / intérpretes para várias linguagens de programação (também vários compiladores para uma linguagem) ou vários navegadores da Internet.
Mischa Arefiev
6
Sua pergunta é presunçosa. “ Por que precisamos de várias conchas? ” Quem disse que precisamos de várias conchas? Seu livro disse que temos várias conchas. Isso não é a mesma coisa.
Rob

Respostas:

15

A maioria dos shells usados ​​em ambientes UNIX modernos deve estar em conformidade com a especificação sh do 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 implementa apenas o requisito mínimo está ausente de muitos recursos necessários para escrever todos os scripts, exceto o mais trivial, de maneira segura e razoável. Por exemplo, variáveis ​​e matrizes locais são extras não padrão.

Portanto, o primeiro motivo é estender o shell com recursos extras. Conchas diferentes optam por se concentrar em coisas diferentes. Por exemplo, o Zsh se concentra em recursos interativos avançados, enquanto o ksh93 (o atual shell korn "original") se concentra em recursos e desempenho avançados de programação. Mesmo shells muito mínimos como o Dash adicionam pelo menos alguns extras não-padrão, como variáveis ​​locais.

Recursos extras raramente são amplamente interoperáveis, se houver. A maior parte do conjunto de recursos do ksh88 é bastante interoperável, como a sintaxe de globbing estendida, 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.

A segunda razão é legada. Ainda existem muitos Unixes proprietários por aí que usam implementações não padronizadas antigas para o seu / bin / sh. Até recentemente, o Solaris ainda usava Bourne como sua armadilha 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 em 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. Os sistemas embarcados geralmente exigem pequenas conchas, como mksh ou busybox sh.
  • Razões de licenciamento. O AT&T ksh era um software proprietário até cerca de 2000. Foi isso que deu origem a todos os clones do tipo ksh, como Zsh e Bash.
  • Outras razões históricas. Embora não seja muito popular hoje em dia, houve tentativas radicais de redesenhar o idioma, como scsh e es. O recurso de substituição de processo de muitos shells vem originalmente do rc (com sintaxe um pouco diferente) e da expansão do csh. Cascas diferentes têm combinações diferentes de tais recursos disponíveis, geralmente com algumas diferenças sutis ou não tão sutis.
ormaaj
fonte
2
Note que, embora localnão seja POSIX ou Unix, ele é especificado e necessário no padrão Linux (LSB) e no padrão de política debian . Observe que esé um acompanhamento rc.
Stéphane Chazelas
1
O que agora se mkshoriginou como o Domínio Público Bourne Shell, que também foi escrito devido a motivos de licenciamento. (Estas questões ainda permanecem - licenciamento e portabilidade e tamanho foram os três fatores que me ajudaram a persuadir Google para incluir mksh com Android.)
mirabilos
19

Porque as pessoas têm necessidades diferentes e é bom ter alternativas que atendam às suas necessidades na situação em questão. 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, ao contrário do que o Microsoft Windows escolheu 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 existem GNOME, KDE, Xfce, LXDE, E17, etc.?

gertvdijk
fonte
12
Precisamente. Alguém poderia perguntar "por que tantos gerenciadores de janelas?" também. Um nativo unix pode fazer a pergunta oposta: por que apenas um CMD.EXE? Por que o Windows é tão rígido e não personalizável?
Bruce Ediger
1
@BruceEdiger Como assim, apenas um cmd.exe? Existem alternativas, se você quiser usá-las. Até a própria Microsoft tem o PowerShell como alternativa.
Malcolm
3
Mesmo COMMAND.COMno DOS era substituível. No entanto, você costuma ter um sistema muito frágil devido às suposições de outros aplicativos (e outros usuários). Como resultado, existem poucas alternativas de sucesso para CMD.EXE. Um deles é o PowerShell, que tem a inércia da Microsoft em apoiá-lo. Outro exemplo é, estranhamente, bashdevido ao apoio decente da comunidade Cygwin, sem mencionar o pessoal do MinGW. Quanto aos gerenciadores de janelas, o Windows teve apenas um de cada vez, mas houve vários ao longo do tempo à medida que o próprio ambiente do Windows evoluiu.
RBerteig
+1 para esta resposta. Eu acho que é por isso que temos tantos sabores UNIX diversificados: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, FreeBSD, NetBSD, OpenBSD, ... o nome dele!
tonga
4

Resposta curta

Devido a uma história estranha de licenciamento, nenhuma entidade desenvolveu o Unix. Foi um processo comunitário em que voluntários e empresas participaram. Essas entidades nem sempre compartilham todas as suas ferramentas, então conchas separadas acontecem. Quando percebemos o quão contraproducente é isso, era tarde demais para unificar todas as conchas em uso. Em vez disso, foi feito um trabalho para garantir que todas essas conchas seriam (teoricamente) compatíveis entre si .

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

rahmu
fonte
2

Existem diferentes shells pelas mesmas razões que diferentes navegadores da web: todo mundo tem uma preferência e alguns shells têm bagagem ou momento histórico. Cada um tem características e idiossincrasias diferentes.

dotancohen
fonte
1

Principalmente, história ...

Bourne foi desenvolvido como parte do SysV Unix (proprietário), enquanto o BSD usava 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). Um shell tipo Bourne foi adotado no padrão POSIX. O ksh é compatível e o bash pode ser compatível.

Os shells gostam cshe tcshsão muito mais fáceis de usar interativamente do que o shell Bourne original (que não possui conclusão de comando, etc.), mas são horríveis para scripts ...

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 costuma ser usada.

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

Gert van den Berg
fonte
3
-1 por pensar que o mundo começou no SysV. O shell Bourne foi lançado no UNIX v7 em 1977, seis anos antes do lançamento do SysV.
29412 Rob
@ Rob, s / de 1977, / 1979 /
Stéphane Chazelas
Bastante justo ... A história * nix é bastante complicado ... Ver en.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg