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?
bash
e sh
são duas conchas diferentes. Basicamente bash
é sh
, com mais recursos e melhor sintaxe. A maioria dos comandos funciona da mesma forma, mas são diferentes.
Dito isto, você deve perceber que /bin/sh
na maioria dos sistemas haverá um link simbólico e não será invocado sh
. No Ubuntu /bin/sh
costumava se conectar bash
, comportamento típico nas distribuições Linux, mas agora mudou para o link para outro shell chamado dash . Eu usaria bash
, pois esse é praticamente o padrão (ou pelo menos o mais comum, da minha experiência). De fato, surgem problemas quando um script bash será usado #!/bin/sh
porque o criador do script assume que o link está para bash
quando não precisa ser.
Para mais informações, http://man.cx/sh , http://man.cx/bash .
/bin/sh
costumava ser um shell chamado bourne shell em 1977. o bash é um shell compatível com / bin / sh que pode ser usado como um substituto do shell bourne em conformidade com o posix. pt.wikipedia.org/wiki/Bourne_shellNo Linux e outros sistemas similares ao Unix, você pode escolher vários shells.
O shell é responsável não apenas por desenhar seu pequeno prompt, mas também por interpretar seus comandos, especialmente se você colocar em 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 outras conchas usadas ao longo da história do Unix. Seu nome, bash é uma abreviação 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.
Atualmente, ele é executado a partir de
/bin/bash
- qualquer sistema com bash o terá aqui.Mas não são apenas os usuários que usam conchas. Os 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 diferentes shells têm pequenas inconsistências entre eles e, quando se trata de executar scripts, esses podem ser um problema real. O bash possui muitos recursos de script exclusivos apenas do bash e não de outros shells. Tudo bem, se você sempre usar o bash para executar esses scripts. Outros shells podem tentar emular o bash ou aderir ao padrão POSIX, que o bash suporta muito bem (embora inclua suas próprias extensões no).
É possível especificar na parte superior de um script de shell qual 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 bash, em vez de outro shell./ bin / sh é um executável que representa 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 do shell padrão que os scripts do sistema devem usar. Nas distribuições Linux, por um longo período, isso geralmente era um link simbólico para o bash , tanto que se tornou uma convenção sempre vincular / bin / sh ao bash ou um shell compatível com o bash. No entanto, nos últimos dois anos, o Debian (e Ubuntu) decidiu mudar o shell do sistema do bash para o dash- um shell semelhante - rompendo 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, o 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 é razoavelmente 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 existentes que usam
#!/bin/sh
(o shell do sistema) como shebang, mas que exigem extensões específicas do bash. Atualmente, este é considerado um bug que deve ser corrigido pelo Debian e Ubuntu, que exige que o / bin / sh possa funcionar quando apontado para o traço.Mesmo que o shell do sistema do Ubuntu esteja apontando para o hífen, seu shell de login como usuário continua sendo debatido no momento. Ou seja, quando você faz login em um emulador de terminal em qualquer lugar do Linux, seu shell de logon será acionado. A velocidade da operação não é 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 no diretório inicial).
O que você deve usar ao escrever scripts
Se o seu script exigir recursos suportados apenas pelo bash, use
#!/bin/bash
.Mas, se possível, seria bom garantir que seu script seja compatível com POSIX e utilizá-lo
#!/bin/sh
, o que deve sempre, de maneira bastante confiável, apontar para o shell do sistema compatível com POSIX preferido em qualquer instalação.fonte
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
.Na página do manual bash (1) :
Por exemplo, a sintaxe específica do bash:
dá um erro em um shell começando com
#!/bin/sh
, mesmo com o link simbólico sh-> bash no lugar.fonte
GNU Bash:
#!/bin/bash
; POSIX Shell:#!/bin/sh
.fonte