Qual é o sentido de estar vinculado ao traço?

36

Eu estou querendo saber o que é o ponto de shser simbólico ligado dash? Entendo que dashdeveria ser mais rápido do que bash, mas não sei por que o shshell original não está presente sh.

Ou se alguma coisa, por que não está shvinculada bash?

NerdOfCode
fonte

Respostas:

72

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/shpelo 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 shrecursos 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/shtinha 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 shchamadas 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/shno 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/shscripts) 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.

Gilles 'SO- parar de ser mau'
fonte
Eu diria que existem boas razões para usar o ksh93 como / bin / sh - é um dos shells POSIX de maior desempenho disponíveis. Concordou que a onipresença do traço é uma questão de tempo.
Charles Duffy
2
O @CharlesDuffy Ksh93 é mais rápido em fazer coisas complexas, mas o dash supera o tempo de inicialização e, para scripts simples (como todas as chamadas para system(3) que os aplicativos fazem), esse é o fator dominante.
Gilles 'SO- stop be evil'
21

Velocidade e conformidade com POSIX (em outras palavras, portabilidade) são os principais fatores. Lembre-se de que /bin/shse 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 bashsã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:

Por que essa alteração foi feita? O principal motivo para mudar o shell padrão foi a eficiência. o bash é um excelente shell completo adequado para uso interativo; de fato, ainda é o shell de login padrão. No entanto, é bastante grande e lento iniciar e operar em comparação com o traço. Um grande número de instâncias de shell é iniciado como parte do processo de inicialização do Ubuntu. Em vez de alterar cada um deles individualmente para executar explicitamente em / bin / dash, uma alteração que exigiria manutenção contínua significativa e que seria suscetível de regredir se não prestasse muita atenção, a equipe de desenvolvimento principal do Ubuntu achou que era melhor simplesmente mudar o shell padrão. As melhorias na velocidade de inicialização no Ubuntu 6.10 foram atribuídas incorretamente ao Upstart, que é uma plataforma excelente para o desenvolvimento futuro do sistema init, mas no Ubuntu 6. 10 estava sendo executado principalmente no modo de compatibilidade do System V, com apenas pequenas alterações comportamentais. Essas melhorias foram, de fato, em grande parte devido ao / bin / sh alterado.

E aqui está uma observação sobre portabilidade:

O manual de políticas da Debian há muito tempo determina que "scripts de shell especificando '/ bin / sh' como intérprete devem usar apenas recursos POSIX"; de fato, esse requisito está em vigor desde bem antes do início do projeto Ubuntu. Além disso, quaisquer scripts de shell que esperassem ser portáveis ​​para outros sistemas Unix, como BSDs ou Solaris, já atendiam a esse requisito. Assim, sentimos que o impacto de compatibilidade dessa alteração seria mínimo.

Veja https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
fonte
Não dashsuporta recursos desnecessários POSIX?
NerdOfLinux
@NerdOfLinux Realmente não importa o que o / bin / sh suporte além do POSIX (desde que essas inclusões não quebrem os scripts do POSIX); o importante é que ele suporta tudo POSIX (e é o mais rápido possível). Desde que o dash atenda a esses requisitos, / bin / sh poderá vincular a ele.
Guntram Blohm apoia Monica
9

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/shser 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/shdo 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/shque 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.

thomasrutter
fonte
“O Dash é muito rápido, mas também é muito compatível com o POSIX - um padrão que está alinhado com o shell Bourne.” Sim, embora o POSIX esteja mais intimamente relacionado ksh, eu diria. Não me lembro do shell Bourne ter expansão aritmética `$ (())`, que é POSIX.
Sergiy Kolodyazhnyy
1
Além disso, em Bourne, ^é um caractere de pipe - echo foo ^ catserá emitido foo ^ catno POSIX sh, mas foono Bourne; esse teste específico é como o Autoconf diferencia os dois.
Charles Duffy
Interessante, então por POSIX você quer dizer Korn?
thomasrutter
0

/bin/shestá vinculado ao /bin/dashque acredito ser motivos de compatibilidade. Muitos scripts simplesmente começam com

#!/bin/sh

portanto, mudando para dashe não criando um link simbólico, muitos scripts falhariam em ser executados corretamente (ou mesmo) se /bin/shnão existissem.

A alteração foi feita de bashpara dashporque, de acordo com https://wiki.ubuntu.com/DashAsBinSh :

O principal motivo para mudar o shell padrão foi a eficiência. o bash é um excelente shell completo adequado para uso interativo; de fato, ainda é o shell de login padrão. No entanto, é bastante grande e lento iniciar e operar em comparação com o traço. Um grande número de instâncias de shell é iniciado como parte do processo de inicialização do Ubuntu. Em vez de alterar cada um deles individualmente para executar explicitamente em / bin / dash, uma alteração que exigiria manutenção contínua significativa e que seria suscetível de regredir se não prestasse muita atenção, a equipe de desenvolvimento principal do Ubuntu achou que era melhor simplesmente mudar o shell padrão.

shnão está vinculado a bash, porque

O manual de políticas da Debian há muito tempo determina que "scripts de shell especificando '/ bin / sh' como intérprete devem usar apenas recursos POSIX"

Se você deseja usar bashcomo /bin/sh:

Se os problemas forem mais comuns e você desejar alterar o shell do sistema padrão novamente, poderá instruir o sistema de gerenciamento de pacotes a parar a instalação do traço como / bin / sh:

sudo dpkg-reconfigure dash

Existem alguns recursos que dashfornecem que o bash não, como:

existe ainda uma chance externa de que existam alguns scripts que agora dependem de algum recurso do dash que o bash não fornece!

NerdOfLinux
fonte
Eu já entendia a compatibilidade pode ser aa fator, mas eu estava procurando um não tão óbvio e mais em resposta profundidade ...
NerdOfCode
2
Então, se eu fosse para instalar o shell Bourne originais shpara /bin/sh, faria este parafuso até os scripts de inicialização?
dessert
Provavelmente seria melhor tentar isso em uma máquina virtual antes de implantação para o mundo real ...
NerdOfCode
2
Você deve deixar /bin/shcomo 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.
thomasrutter
1
@mckenzm O /bin/shlink do shell é separado do qual um usuário específico definiu como o shell de login inicial. O alvo /bin/shnão depende de qual usuário está procurando, e você fazer necessidade de usar sudo--ou outros meios de agir como o usuário root - para mudá-lo. Além disso, em geral e para qualquer pacote, dpkg-reconfiguredeve 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 o chshcomando O nome do shell de login inicial de uma pessoa também entra $SHELLe é usado para alguns shells interativos que não são de login.
Elias Kagan