Qual é a diferença entre #! / bin / sh e #! / bin / bash?

216

se eu escrever,

#!/bin/bash
echo "foo"

ou

#!/bin/sh
echo "foo"

ambos produzem o mesmo. Eu vi alguns scripts começando com #!/bin/sh ou #!/bin/bash . Existe alguma diferença entre eles?

    
por Rahul Virpara 25.05.2012 / 05:59

3 respostas

182

bash e sh são dois shells diferentes. Basicamente bash é sh , com mais recursos e melhor sintaxe. A maioria dos comandos funciona da mesma forma, mas eles são diferentes.

Dito isto, você deve perceber que /bin/sh na maioria dos sistemas será um link simbólico e não invocará sh . No Ubuntu /bin/sh costumava linkar para bash , comportamento típico nas distribuições Linux, mas agora mudou para vincular a outro shell chamado dash . Eu usaria bash , como isso é praticamente o padrão (ou pelo menos o mais comum, da minha experiência). Na verdade, surgem problemas quando um script bash usa #!/bin/sh porque o criador de scripts assume que o link é para bash quando não precisa ser.

Para mais informações, link , link .

    
por reverendj1 25.05.2012 / 06:08
63

No Linux e em outros sistemas semelhantes ao Unix, você tem várias opções de shells.

O shell é responsável não apenas por desenhar o seu pequeno prompt, mas também por interpretar seus comandos, especialmente se você colocar uma lógica complicada como pipes, condicionais e assim por diante.

bash é o shell mais comum usado como shell padrão para usuários de sistemas Linux . É um descendente espiritual de outros shells usados em toda a história do Unix. Seu nome, bash é uma abreviatura de Bourne-Again Shell, uma homenagem ao shell Bourne que foi projetado para substituir, embora também incorpore recursos do C Shell e do Korn Shell.

Ele é executado, atualmente, em /bin/bash - qualquer sistema com o bash o terá acessível aqui.

Não são apenas os usuários que usam shells, no entanto. Scripts ( shell scripts ) precisam de shells para interpretá-los. Quando você executa um script de shell, seu sistema precisa iniciar um processo de shell para executar seu script.

O problema é que shells diferentes têm pequenas inconsistências entre eles, e quando se trata de executar scripts, isso pode ser um problema real. O bash tem muitos recursos de script que são exclusivos apenas para o bash, e não para outros shells. Tudo bem, se você sempre usará o bash para rodar esses scripts. Outros shells podem tentar emular o bash, ou aderir ao padrão POSIX, que o bash suporta muito bem (embora adicione suas próprias extensões).

É possível especificar no topo de um script de shell que shell ele deve ser executado usando um shebang. Um script pode especificar #!/bin/bash na primeira linha, o que significa que o script deve sempre ser executado com o bash, em vez de outro shell.

/ bin / sh é um executável representando o shell do sistema . Na verdade, geralmente é implementado como um link simbólico apontando para o executável para qualquer shell que seja o shell do sistema. O shell do sistema é o tipo de shell padrão que os scripts do sistema devem usar. Nas distribuições do Linux, por um longo tempo isso era geralmente um link simbólico para bash , tanto que se tornou uma convenção sempre ligar / bin / sh para bash ou um shell compatível com bash . No entanto, nos últimos dois anos, o Debian (e o Ubuntu) decidiram mudar o shell do sistema de bash para dash - semelhante quebra de shell com uma longa tradição no Linux (bem, GNU) de usar o bash para / bin / sh. O Dash é visto como um shell mais leve e muito mais rápido, que pode ser benéfico para a velocidade de inicialização (e outras coisas que exigem muitos scripts de shell, como scripts de instalação de pacotes).

O Dash é bastante compatível com o bash, baseando-se no mesmo padrão POSIX. No entanto, ele não implementa as extensões específicas do bash. Existem scripts que usam #!/bin/sh (o shell do sistema) como seu shebang, mas que requerem extensões específicas do bash. Este é atualmente considerado um bug que deve ser corrigido pelo Debian e pelo Ubuntu, que requerem que / bin / sh seja capaz de funcionar quando apontado para dash.

Mesmo que o shell do sistema do Ubuntu esteja apontando para dash, seu login shell como um usuário continua sendo o bash neste momento. Ou seja, quando você efetua login em um emulador de terminal em qualquer lugar no Linux, seu shell de login será bash. A velocidade de operação não é tanto um problema quando o shell é usado interativamente, e os usuários estão familiarizados com o bash (e podem ter personalizações específicas do bash em seu diretório inicial).

O que você deve usar ao escrever scripts

Se o seu script requer recursos suportados apenas pelo bash, use #!/bin/bash .

Mas, se possível, seria bom certificar-se de que seu script é compatível com POSIX, e use #!/bin/sh , que deve sempre, de maneira confiável, apontar para o shell de sistema compatível com POSIX em qualquer instalação. / p>     

por thomasrutter 25.05.2012 / 10:31
15

Além das respostas anteriores, mesmo que /bin/sh seja um link simbólico para /bin/bash , #!/bin/sh não é totalmente equivalente a #!/bin/bash .

Da página man do bash (1) :

% bl0ck_qu0te%

Por exemplo, a sintaxe específica do bash:

 exec  > >(tee logfile.txt)

apresenta um erro em um shell que começa com #!/bin/sh , mesmo com o link simbólico sh- > bash no lugar.

    
por AnkiF 14.01.2015 / 12:24