A resposta curta para "por que o sh shell original não está presente em sh
" é que não há sh original.
Bem, ok, existe: é o shell Thompson . A versão 1 tinha alguns dos recursos que conhecemos hoje, em especial o redirecionamento e os canais (leia o artigo de Dennis Ritchie sobre início do histórico do Unix ). Versões posteriores adicionaram recursos como execução em segundo plano com &
, globbing (implementado com um programa externo ), e algumas formas de citar, mas não possuía variáveis ou estruturas de controle aninhadas. Condicionais e loops foram fornecidos por meio de programas externos if
(que recebeu uma condição e um comando como argumentos) e < href="https://etsh.io/man/goto.1.txt"> goto
(que funcionava alterando a posição do arquivo de seu pai no arquivo de script).
Em 1979, em Unix V7 , o shell Thompson foi substituído como /bin/sh
pelo Bourne shell . A primeira versão já tinha muitos dos recursos que estão presentes hoje em dia e versões subsequentes introduzidas muito mais . Alguns anos mais tarde, o shell Korn entrou em cena, com um crescente conjunto de recursos; muitas variantes do Unix o instalaram sob o nome ksh
.
Em 1992, POSIX codificou um conjunto mínimo de recursos de sh
que era basicamente Bourne e algumas outras coisas. Qualquer sistema que se chamava “Unix” tinha que implementar pelo menos esses recursos. Os sistemas comerciais Unix geralmente usavam o ksh como o POSIX sh, mas alguns (por exemplo, OSF / 1 ) tinham seus próprio.
/bin/sh
tinha que ser outra coisa. A maioria das distribuições Linux foi para bash , uma shell da Projeto GNU que tendia a ser entre Bourne e Korn em termos de recursos de script, e muito melhor do que o uso interativo. A única alternativa viável foi o pdksh (“shell Korn de domínio público”), um livre (agora descontinuado, mas vivendo como mksh , que é ativamente desenvolvido ), mas não me lembro de uma distribuição Linux usando pdksh como /bin/sh
, não sei porque, eu acho, porque as distribuições Linux eram sempre distribuições GNU / Linux, basicamente distribuindo versões GNU de qualquer ferramenta para a qual existisse uma versão GNU.
Também houve várias implementações de código-fonte aberto de sh
chamadas "ash", mais notavelmente a concha de Almquist , mas eles eram muito incompletos, faltando alguns recursos POSIX que as pessoas queriam usar. Um programador que era mantenedor do Debian, Herbert Xu , estendeu as cinzas para torná-lo compatível com POSIX. Eventualmente, sua versão foi renomeada para dash, e houve algum esforço para torná-la /bin/sh
no Debian em vez de bash. O Ubuntu começou antes do Debian começar a tratar sistematicamente os bashisms (o uso de funcionalidades específicas do bash em #!/bin/sh
scripts) como bugs . Ambos trocaram um (Ubuntu 6.10), Debian somente em 2009 ( era um objetivo para o lenny mas a mudança só foi feita após o lançamento do lenny, ou seja, no squeeze)).
Um importante motivo para usar o dash como em vez de bash , pois /bin/sh
é que ele é significativamente mais rápido. Isso foi especialmente importante para o Ubuntu, que se esforçou para manter os tempos de inicialização curtos desde o início. Dash também tende a usar menos memória do que o bash, o que é um pouco importante para os scripts de wrapper que ficam por perto apenas para fazer um pouco de limpeza quando o programa subjacente sai. Outro benefício do dash é que ele só depende da libc (a biblioteca principal do sistema), enquanto o bash também depende de bibliotecas de suporte ao terminal (ele não pode ser iniciado sem elas, nem mesmo para executar um script); Isso significa que o traço tem uma chance melhor de continuar trabalhando em um sistema quebrado.
Em algum ponto durante o século 21, o shell Korn foi open source, e versões open source do shell Bourne apareceram (versões antigas, porque o desenvolvimento havia cessado anos antes). Mas dash e bash estavam muito firmemente entrincheirados no mundo Linux para que eles obtivessem alguma aceitação, especialmente o shell Bourne, já que seu valor hoje é apenas histórico. Dash deslocado bash porque tinha benefícios claros, mas nenhum dos outros contendores tem qualquer vantagem decisiva como /bin/sh
.