Qual é a diferença entre bash e sh?

28

Eu vejo dois tipos de código sendo usados:

#!/usr/bin/sh

e:

#!/user/bin/bash

Eu procurei por isso online e as opiniões variam muito. As explicações que vi na maioria dos sites dizem que shé mais antigo bashe que não há diferença real.

Alguém sabe a diferença entre estes? Você pode me dar um exemplo prático de quando usar um sobre o outro?

Saif Bechan
fonte
Para uma visão geral sobre os diferentes shells (e não apenas she bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira
1
Outra grande história aqui: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Respostas:

34

bashé um superconjunto de shie. tudo o que você pode fazer, shvocê pode fazer bash.

O Bash possui mais recursos (ramificação, embutidos, matrizes), facilitando a escrita do script. Alguns mais tarde * nix'es têm /bin/shcomo um link para/bin/bash

Para uma explicação completa do que é um tutorial

Nifle
fonte
5
@ Saif Bechan: Uma razão pela qual o shell Bourne ( sh) não foi apenas estendido é que o Bash` foi escrito por outra pessoa. Também aposto que houve problemas de licença. Leia o artigo sobre o Bourne Shell br.wikipedia.org/wiki/Bourne_shell
Felix
7
Removing sh would break a lot of scripts which expect it to be there and rely on the way it parses things. Linux users might not care, but people spending $$thousands on Solaris, AIX or HP-UX might be very annoyed.
njd
3
... e ainda mais divertido, o Ubuntu simboliza / bin / sh para correr. O Dash não é totalmente compatível com sh ou bash, mas deve iniciar mais rapidamente. Quando o sistema está inicializando, todos os scripts init.d são executados e acho que o tempo economizado no geral vale a pena.
Kbyrd 30/03/10
8
Tenho certeza de que o Dash é completamente compatível com sh. O problema é que algumas pessoas escrevem scripts que dizem / bin / sh, mas o próprio script exige que / bin / bash funcione. Ninguém percebe um problema, porque na maioria das vezes, / bin / sh simplesmente aponta para / bin / bash.
davr
8
@ Saif: Há outra razão pela qual shnão foi simplesmente estendida: seu código-fonte é um inferno. Dê uma olhada. É suposto ser C ...
grawity 21/03
6

Tradicionalmente, / bin / sh teria sido o shell Bourne original, que não possui histórico nem edição de linha de comando, nem controle de trabalho.

Nos últimos 15 anos ou mais, a maioria dos Unixes tem o shell POSIX instalado, ou pelo menos ksh ou bash (que são muito parecidos com o POSIX), mas ainda possuem o shell mais limitado em / bin / sh

A razão para isso é que scripts shell mais antigos, que esperam que o shcomando mais antigo ainda funcione.
Desde caracteres gosto {, }e !tem um significado especial para bash, é possível que um script shell mais velho usando esses caracteres (sem escapar deles) pode falhar.
(O shell Bourne levaria !!{1,2}literalmente, enquanto o bash interpretaria isso como uma repetição do comando anterior ( !!) seguido de uma expansão de chave).

No Linux, porém, o shcomando quase sempre é apenas um link para bash, com os mesmos recursos.

njd
fonte
2
O Bash deve (mas nem sempre) se comportar no modo de compatibilidade com sh se invocado como / bin / sh. Muita coisa quebrou quando o Ubuntu mudou / bin / sh de vincular para / bin / bash para vincular a / bin / dash. As coisas que quebraram assumiram basismos quando deveriam estar usando sh padrão.
Broam 31/03/10
4

sh pode significar shell Bourne ou / bin / sh, que é outro shell (compatível com POSIX) na maioria das plataformas modernas. "O shell POSIX" é o shell abstrato definido pelo POSIX , que é implementado pelo bash no modo POSIX, ou ksh ou dash por padrão. Às vezes, o / bin / sh também é chamado de shell POSIX, porque é um shell compatível com o POSIX na maioria das plataformas. As conchas Bourne originais não são conchas POSIX.

O bashref tem uma lista de diferenças entre as conchas bash e Bourne . man bashpossui uma lista de alterações quando o bash é chamado no modo POSIX .

/ bin / sh não é um link simbólico ou um link físico no OS X, mas é quase do mesmo tamanho que / bin / bash:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

festança do homem :

Se o bash for chamado com o nome sh, ele tentará imitar o comportamento de inicialização das versões históricas do sh o mais próximo possível, além de estar em conformidade com o padrão POSIX.

A imitação de conchas Bourne é bastante limitada. bash +B(Bourne) desabilitaria recursos como expansão de chaves.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Mas mesmo se você desabilitar o modo POSIX, o eco se comportará como echo -epor padrão:

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh é um traço no Ubuntu , então alguns basismos funcionam com / bin / sh no OS X, mas não no Ubuntu.

Se você realmente deseja escrever scripts para (algo como) os shells Bourne originais, você pode usá-lo #!/usr/bin/env bash +B.

Eu acho que é mais fácil escrever scripts para o bash do que evitar recursos que não fazem parte das especificações POSIX ou shells Bourne ou testar tudo com outros shells.

Lri
fonte
2

Na verdade, mesmo que / bin / sh possa ser um link para / bin / bash, se iniciado como sh, ele se comporta de maneira diferente. Na página de manual do bash:

Se o bash for chamado com o nome sh, ele tentará imitar o comportamento de inicialização das versões históricas do sh o mais próximo possível, além de estar em conformidade com o padrão POSIX.

Assim sh, ele tenta imitar o comportamento histórico da sh. Como bash, tenta ser o mais útil possível como um shell de logon interativo.

KeithB
fonte
2

Em muitos sistemas e no Solaris em particular, o bash é vinculado dinamicamente enquanto sh é estaticamente vinculado. Isso pode representar uma ameaça à segurança, por esse motivo, o usuário root deve usar apenas / bin / sh como shell (se você precisar fazer logon como root).

Alessandro Vozza
fonte
2
Também pode ser útil em caso de emergência, se você fez algo ruim ldconfigou se seu /libdiretório foi destruído por algum motivo.
LawrenceC