Questão Qual é a diferença entre #! / Bin / sh e #! / Bin / bash?


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?


211
2018-05-25 03:59


origem




Respostas:


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 eles são diferentes.

Dito isto, você deve perceber /bin/sh na maioria dos sistemas será um link simbólico e não invocará sh. No Ubuntu /bin/sh usado para vincular bash, comportamento típico em distribuições Linux, mas agora mudou para vincular a outro escudo chamado traço. 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 usará #!/bin/sh porque o criador de scripts assume que o link é bash quando não tem que ser.

Para mais informações, http://man.cx/sh, http://man.cx/bash.


178
2018-05-25 04:08



Seu primeiro parágrafo é bastante enganador. "sh" não é um shell, mas um symlink para o configurado atualmente shell do sistema, que nos sistemas Linux é geralmente bash ou dash (versões recentes do Ubuntu usando o último). - thomasrutter
/bin/sh costumava ser uma casca chamada concha de bourne em 1977. bash é um shell compatível com / bin / sh que posso pode ser usado como uma substituição de shell bourne que esteja em conformidade com posix. en.wikipedia.org/wiki/Bourne_shell - Alex
festança é um padrão de fato (muito usado), mas não é "padrão"; sh no Ubuntu usa traço, que é um shell compatível com Posix, então é realmente padrão. Meu conselho é usar traço sempre que possível para scripts, especialmente para scripts do lado do servidor. Apesar festançaé mais expressivo, traço funciona muito mais rápido e é mais seguro. - Rick-777
@ Rick-777 Então eu deveria explicitamente colocar #! / Bin / dash no topo dos meus scripts? Eu também escrevi scripts onde eu só escrevo comandos e executo com ./scriptName e isso funcionou bem. É o #! / Bin / yourShellHere necessário? - user137717
@ Rick-777 Nos casos em que eu excluir qualquer #! / Bin / shellName, eu nomeei os arquivos fileName.sh. Irá implicitamente ligar-se ao shell do sistema preferido sem declarar #! / Bin / sh? - user137717


No Linux e em outros sistemas semelhantes ao Unix, você tem a opção de vários shells.

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

festança é 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, festança é uma abreviação de Bourne-Again Shell, uma homenagem ao shell Bourne que foi projetado para substituir, embora também incorpore recursos da C Shell e da Korn Shell.

É executado, hoje em dia, de /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 (scripts de shell) precisa de conchas para interpretá-las. 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. festança tem um monte de recursos de script que são exclusivos apenas para 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 este foi geralmente um link simbólico para festança, tanto que se tornou uma convenção sempre ligar / bin / sh para bash ou um shell compatível com bash. No entanto, nos últimos anos, o Debian (e o Ubuntu) decidiram mudar o shell do sistema de bash para traço - uma quebra de shell similar com uma longa tradição no Linux (bem, GNU) de usar o bash para / bin / sh. 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).

Dash é razoavelmente compatível com o bash, sendo baseado 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 seu shebang, mas que requerem extensões específicas do bash. Isso é considerado atualmente bug que deve ser corrigido pelo Debian e pelo Ubuntu, que requerem / bin / sh para poder trabalhar quando apontado para dash.

Mesmo que o Ubuntu shell do sistema está apontando para traço, seu shell de login como um usuário continua a ser 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 for possível, seria bom certificar-se de que seu script é compatível com POSIX e usar #!/bin/sh, que deve sempre, de forma bastante confiável, apontar para o shell de sistema compatível com POSIX preferido em qualquer instalação.


62
2018-05-25 08:31





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

De bash (1) man page :

"Se o bash é chamado com o nome sh, ele tenta imitar a inicialização   comportamento das versões históricas de sh, tanto quanto possível, enquanto   em conformidade com o padrão POSIX também. "

Por exemplo, a sintaxe específica do bash:

 exec  > >(tee logfile.txt)

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


15
2018-01-14 11:24