O que é sh
sh(ou a Shell Command Language) é uma linguagem de programação descrita pelo padrão POSIX . Ele tem muitas implementações ( ksh88, dash...). bashtambém pode ser considerada uma implementação de sh(veja abaixo).
Porque shé uma especificação, não uma implementação, /bin/shé um link simbólico (ou um link físico) para uma implementação real na maioria dos sistemas POSIX.
O que é bash
bashcomeçou como uma shimplementação compatível (embora anteceda o padrão POSIX em alguns anos), mas com o passar do tempo, adquiriu muitas extensões. Muitas dessas extensões podem alterar o comportamento de scripts de shell POSIX válidos, portanto, por si só, bashnão é um shell POSIX válido. Pelo contrário, é um dialeto da linguagem shell POSIX.
bashsuporta um --posixswitch, o que o torna mais compatível com POSIX. Ele também tenta imitar o POSIX se chamado como sh.
sh = festança?
Por um longo tempo, /bin/shcostumava apontar para /bin/basha maioria dos sistemas GNU / Linux. Como resultado, quase se tornou seguro ignorar a diferença entre os dois. Mas isso começou a mudar recentemente.
Alguns exemplos populares de sistemas para os quais /bin/shnão aponta /bin/bash(e em alguns dos quais /bin/bashpodem até não existir) são:
- Sistemas modernos Debian e Ubuntu, que simbolizam
shcomo dashpadrão;
- Busybox , que geralmente é executado durante o tempo de inicialização do sistema Linux como parte de
initramfs. Ele usa a ashimplementação do shell.
- BSDs e, em geral, quaisquer sistemas não Linux. O OpenBSD usa
pdksh, um descendente do shell Korn. O FreeBSD shé um descendente do shell original do UNIX Bourne. O Solaris possui um sistema shque, por um longo tempo, não era compatível com POSIX; uma implementação gratuita está disponível no projeto Heirloom .
Como você pode descobrir o que /bin/shaponta para o seu sistema?
A complicação é que /bin/shpoderia ser um link simbólico ou um link físico. Se for um link simbólico, uma maneira portátil de resolvê-lo é:
% file -h /bin/sh
/bin/sh: symbolic link to bash
Se for um link físico, tente
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
De fato, a -Lflag cobre links simbólicos e hardlinks, mas a desvantagem desse método é que ele não é portátil - o POSIX não precisa find oferecer suporte à -samefileopção, embora o GNU find e o FreeBSD o apóiem.
Linha Shebang
Por fim, cabe a você decidir qual usar, escrevendo a linha «shebang».
Por exemplo
#!/bin/sh
usará sh(e o que quer que isso aconteça),
#!/bin/bash
usará /bin/bashse estiver disponível (e falhará com uma mensagem de erro, se não estiver). Obviamente, você também pode especificar outra implementação, por exemplo
#!/bin/dash
Qual usar
Para meus próprios scripts, prefiro shpelos seguintes motivos:
- é padronizado
- é muito mais simples e fácil de aprender
- ele é portátil nos sistemas POSIX - mesmo que eles não tenham
bash, eles precisam tersh
Existem vantagens em usar bashtambém. Seus recursos tornam a programação mais conveniente e semelhante à programação em outras linguagens de programação modernas. Isso inclui coisas como variáveis locais e matrizes com escopo. Plain shé uma linguagem de programação muito minimalista.