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
.
system
(3) que os aplicativos fazem), esse é o fator dominante.Velocidade e conformidade com POSIX (em outras palavras, portabilidade) são os principais fatores. Lembre-se de que
/bin/sh
se destina a scripts do sistema, que podem ou não ter vindo de versões mais antigas do Ubuntu e / ou de outros sistemas.Certamente, os recursos brilhantes de
bash
são legais de usar para nós, usuários, mas quando se trata de executar coisas no ambiente em que você precisa gerenciar vários servidores / sistemas diferentes - ter um shell compatível com POSIX faz muita diferença. Especialmente, se você é um novo administrador de sistemas e ambiente herdado com muitos scripts.Por que o shell Bourne original não está presente, é simples - é um produto proprietário originalmente pertencente à AT&T Bell Labs.
Além disso, há realmente uma explicação explícita no wiki do Ubuntu sobre isso:
E aqui está uma observação sobre portabilidade:
Veja https://wiki.ubuntu.com/DashAsBinSh
fonte
dash
suporta recursos desnecessáriosPOSIX
?Nas distribuições GNU / Linux, o "original
/bin/sh
" é realmente Bash.O GNU queria um shell semelhante ao Bourne que estivesse sob a GPL, e é por isso que eles escolheram o Bash para eles
/bin/sh
, em vez do Bourne, que não era licenciado pela GPL. As distros modernas do Linux herdaram essa decisão a ponto de se tornar um padrão defacto para/bin/sh
ser o Bash. O shell Bourne original ("sh") foi usado em outros Unixes não Linux, até recentemente no Solaris 10, mas nunca foi um dos pilares das distribuições Linux.Mudar
/bin/sh
do bash para o dash foi uma decisão do Debian (herdada pelo Ubuntu) motivada em grande parte pela velocidade - ocorreu em um momento em que eles fizeram um grande esforço para melhorar a velocidade de inicialização, e grande parte do tempo de inicialização da CPU no momento era consistente com a execução scripts de inicialização.O Bash continua a ser usado como o shell interativo / de login padrão para os usuários, mas o Dash é o
/bin/sh
que executa e é executado para scripts do sistema, como scripts init.O Dash é muito rápido, mas também é muito compatível com o POSIX - um padrão alinhado com o shell Bourne. De certa forma, mudando de Bash para Dash, estamos voltando para um shell mais estreitamente alinhado com Bourne.
fonte
ksh
, eu diria. Não me lembro do shell Bourne ter expansão aritmética `$ (())`, que é POSIX.^
é um caractere de pipe -echo foo ^ cat
será emitidofoo ^ cat
no POSIX sh, masfoo
no Bourne; esse teste específico é como o Autoconf diferencia os dois./bin/sh
está vinculado ao/bin/dash
que acredito ser motivos de compatibilidade. Muitos scripts simplesmente começam comportanto, mudando para
dash
e não criando um link simbólico, muitos scripts falhariam em ser executados corretamente (ou mesmo) se/bin/sh
não existissem.A alteração foi feita de
bash
paradash
porque, de acordo com https://wiki.ubuntu.com/DashAsBinSh :sh
não está vinculado abash
, porqueSe você deseja usar
bash
como/bin/sh
:Existem alguns recursos que
dash
fornecem que o bash não, como:fonte
sh
para/bin/sh
, faria este parafuso até os scripts de inicialização?/bin/sh
como o shell fornecido pela distribuição, pois é isso que eles direcionaram com seus scripts de inicialização e similares. Mas se você o substituísse por Bourne, seria principalmente compatível. Eu imaginaria que haveria quebras, porém, apenas devido a pequenas diferenças versus a grande quantidade de código. É claro que você pode usar qualquer shell em seus próprios scripts com um hashbang personalizado./bin/sh
link do shell é separado do qual um usuário específico definiu como o shell de login inicial. O alvo/bin/sh
não depende de qual usuário está procurando, e você fazer necessidade de usarsudo
--ou outros meios de agir como o usuário root - para mudá-lo. Além disso, em geral e para qualquer pacote,dpkg-reconfigure
deve ser executado como root. Por outro lado, os usuários geralmente têm permissão para alterar seu próprio shell de login inicial e podem fazê-lo com ochsh
comando O nome do shell de login inicial de uma pessoa também entra$SHELL
e é usado para alguns shells interativos que não são de login.