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
...). bash
també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
bash
começou como uma sh
implementaçã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ó, bash
não é um shell POSIX válido. Pelo contrário, é um dialeto da linguagem shell POSIX.
bash
suporta um --posix
switch, 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/sh
costumava apontar para /bin/bash
a 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/sh
não aponta /bin/bash
(e em alguns dos quais /bin/bash
podem até não existir) são:
- Sistemas modernos Debian e Ubuntu, que simbolizam
sh
como dash
padrão;
- Busybox , que geralmente é executado durante o tempo de inicialização do sistema Linux como parte de
initramfs
. Ele usa a ash
implementaçã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 sh
que, 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/sh
aponta para o seu sistema?
A complicação é que /bin/sh
poderia 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 -L
flag 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 à -samefile
opçã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/bash
se 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 sh
pelos 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 bash
també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.