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 que bash e que não há diferença real.

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

    
por Saif Bechan 30.03.2010 / 17:54

5 respostas

34

bash é um superconjunto de sh ie. tudo que você pode fazer em sh você pode fazer em bash .

O Bash tem mais recursos (ramificação, builtins, arrays), tornando o script mais fácil de escrever. Alguns posteriores * nix'es têm /bin/sh como um link para /bin/bash

Para uma explicação completa do que aqui está um tutorial

    
por 30.03.2010 / 18:11
6

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

Durante os últimos 15 anos, a maioria dos Unixes teve o shell POSIX instalado, ou pelo menos ksh ou bash (que são quase semelhantes a POSIX), mas ainda tem o shell mais limitado em / bin / sh

A razão para isso é que scripts de shell mais antigos que esperam que o comando sh mais antigo ainda funcionem.
Como caracteres como { , } e ! têm um significado especial para o bash, é possível que um script de shell mais antigo use esses caracteres (sem evitá-los) poderá falhar. (O shell Bourne levaria !!{1,2} literalmente, enquanto o bash interpretaria isso como uma repetição do comando anterior ( !! ) seguido por uma expansão de chave).

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

    
por 30.03.2010 / 18:40
4

sh pode significar shell Bourne ou / bin / sh, que é algum outro shell (compatível com POSIX) na maioria das plataformas modernas. "O shell POSIX" é o resumo shell definido pelo POSIX , que é implementado pelo bash no POSIX modo, ou ksh ou traço por padrão. O / bin / sh às vezes também é chamado de shell POSIX, porque é um shell que está em conformidade com o POSIX na maioria das plataformas. As conchas Bourne originais não são cartuchos POSIX.

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

/ bin / sh não é um symlink ou hard link no OS X, mas é quase do mesmo tamanho que o / 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

homem bash :

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

A imitação de conchas Bourne é, de outro modo, bastante limitada. bash +B (Bourne) realmente desabilitaria recursos como expansão de contraventamento.

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

Mas mesmo que você desative o modo POSIX, o echo se comporta como echo -e por padrão:

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

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

Se você realmente quiser escrever scripts para (algo como) os shells originais de Bourne, você pode usar #!/usr/bin/env bash +B .

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

    
por 28.09.2012 / 19:17
2

Na verdade, mesmo que / bin / sh seja um link para / bin / bash, se iniciado como sh, ele se comportará de maneira diferente. A partir da manch bash:

If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well.

Então, como sh , ele tenta emular o comportamento sh histórico. Como bash , ele tenta ser o mais útil possível como um shell de login interativo.

    
por 30.03.2010 / 21:35
2

Em muitos sistemas e no Solaris em particular, o bash é dinamicamente vinculado, enquanto sh é vinculado estaticamente. 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 logar como root).

    
por 01.04.2010 / 01:32

Tags