A resposta curta para "por que o sh shell original não está presente sh
" é que não há sh original.
Bem, ok, existe: é a concha de Thompson . A versão 1 tinha alguns dos recursos que conhecemos hoje, em particular redirecionamentos e pipes (leia o artigo de Dennis Ritchie sobre a história inicial do Unix ). Versões posteriores adicionaram recursos como execução em segundo plano com &
, globbing (implementado com um programa externo) e algumas formas de citação, mas não possuía variáveis ou estruturas de controle aninhadas. Condicionais e loops foram fornecidos por meio de programas externos if
(que usavam uma condição e um comando como argumentos) e goto
(que funcionava alterando a posição do arquivo pai no arquivo de script).
Em 1979, no Unix V7 , o shell Thompson foi substituído /bin/sh
pelo shell Bourne . O primeiro lançamento já tinha muitos dos recursos que estão presentes hoje em dia, e as versões subsequentes introduziram muitos outros . Alguns anos depois, a concha Korn entrou em cena, com um conjunto crescente de recursos; muitas variantes do Unix o instalaram sob o nome ksh
.
Em 1992, o POSIX codificou um conjunto mínimo de sh
recursos basicamente Bourne, além de algumas coisas. Qualquer sistema que se chamasse de “Unix” precisava implementar pelo menos esses recursos. Os sistemas Unix comerciais usavam normalmente o ksh como o POSIX sh, mas alguns (por exemplo, OSF / 1 ) tinham os seus.
Nem o shell Bourne nem o Korn eram de código aberto até recentemente, portanto, quando o mundo Linux começou a se formar em meados da década de 90, eles não estavam disponíveis. /bin/sh
tinha que ser outra coisa. A maioria das distribuições Linux foi para o bash , um shell do projeto GNU que tendia a estar entre Bourne e Korn em termos de recursos de script e muito melhor do que qualquer um para uso interativo). A única alternativa viável era o pdksh (“domínio público Korn shell”), um gratuito (agora descontinuado, mas vivendo como mksh , que é desenvolvido ativamente ), mas não me lembro de uma distribuição Linux usando o pdksh como/bin/sh
, Não sei por quê, acho que porque as distribuições Linux sempre foram distribuições GNU / Linux, basicamente distribuindo versões GNU de qualquer ferramenta para a qual existia uma versão GNU.
Havia também várias implementações de código aberto sh
chamadas de “ash”, principalmente o shell Almquist , mas eram muito incompletas, faltando alguns recursos do POSIX que as pessoas queriam usar. Um programador que era mantenedor do Debian, Herbert Xu , estendeu o ash para torná-lo compatível com POSIX. Eventualmente, sua versão foi renomeada para dash, e houve algum esforço para fazê-lo /bin/sh
no Debian, em vez de no bash. O Ubuntu começou antes do Debian começar a tratar sistematicamente bashisms (o uso de funcionalidades específicas do bash em #!/bin/sh
scripts) como bugs . Ambos ligado a tarde ( Ubuntu 6.10 , Debian apenas em 2009 ( que era uma meta para lenny mas a troca foi feita somente após o lançamento do lenny, ou seja, no aperto)).
Uma grande razão para usar traço como ao invés de festa como /bin/sh
é que é significativamente mais rápido. Isso foi especialmente importante para o Ubuntu, que se esforça para manter os tempos de inicialização curtos desde o início. O Dash também tende a usar menos memória que o bash, o que é um pouco importante para scripts de wrapper que ficam por perto apenas para fazer uma limpeza quando o programa subjacente é encerrado. Outro benefício do dash é que ele depende apenas da libc (a biblioteca principal do sistema), enquanto o bash também depende das bibliotecas de suporte ao terminal (ele não pode ser iniciado sem elas, mesmo para executar um script); isso significa que o traço tem uma chance melhor de continuar trabalhando em um sistema quebrado.
Em algum momento do século XXI, o shell Korn tornou-se open source e apareceram versões open source do shell Bourne (versões antigas, porque o desenvolvimento havia cessado anos antes). Mas o dash e o bash estavam firmemente entrincheirados no mundo Linux para que eles obtivessem qualquer aceitação, especialmente o shell Bourne, já que seu valor hoje é apenas histórico. O Dash deslocou o bash porque tinha benefícios claros, mas nenhum dos outros competidores tem uma vantagem decisiva como /bin/sh
.