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 bash
e 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?
sh
ebash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsRespostas:
bash
é um superconjunto desh
ie. tudo o que você pode fazer,sh
você pode fazerbash
.O Bash possui mais recursos (ramificação, embutidos, matrizes), facilitando a escrita do script. Alguns mais tarde * nix'es têm
/bin/sh
como um link para/bin/bash
Para uma explicação completa do que é um tutorial
fonte
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_shellsh
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.sh
não foi simplesmente estendida: seu código-fonte é um inferno. Dê uma olhada. É suposto ser C ...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
sh
comando 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
sh
comando quase sempre é apenas um link parabash
, com os mesmos recursos.fonte
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 bash
possui 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:
festança do homem :
A imitação de conchas Bourne é bastante limitada.
bash +B
(Bourne) desabilitaria recursos como expansão de chaves.Mas mesmo se você desabilitar o modo POSIX, o eco se comportará como
echo -e
por padrão:/ 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.
fonte
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:
Assim
sh
, ele tenta imitar o comportamento histórico da sh. Comobash
, tenta ser o mais útil possível como um shell de logon interativo.fonte
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).
fonte
ldconfig
ou se seu/lib
diretório foi destruído por algum motivo.