O que é sh
sh
(ou a Linguagem de Comandos da Shell) é uma linguagem de programação descrita pelo POSIX
padrão .
Tem muitas implementações ( ksh88
, dash
, ...). bash
também pode ser
considerada uma implementação de sh
(veja abaixo).
Como 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 implementação sh
-compatible (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 uma opção --posix
, o que a torna mais compatível com POSIX. Ele também tenta imitar POSIX se invocado como sh
.
sh = bash?
Por muito tempo, /bin/sh
costumava apontar para /bin/bash
na 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 em que /bin/sh
não aponta para /bin/bash
(e em alguns dos quais /bin/bash
podem nem existir) são:
- Sistemas Debian e Ubuntu modernos, que ligam
sh
adash
por padrão; -
Busybox , que geralmente é executado durante o tempo de inicialização do sistema Linux como parte de
initramfs
. Ele usa a implementação do shellash
. - BSDs e, em geral, quaisquer sistemas não-Linux. O OpenBSD usa
pdksh
, um descendente do shell Korn. Osh
do FreeBSD é um descendente do shell Bourne do UNIX original. O Solaris possui seu própriosh
, 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 para que /bin/sh
aponta no 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
Na verdade, o sinalizador -L
abrange os links simbólicos e os links físicos,
mas a desvantagem desse método é que ele não é portátil
POSIX não requer find
para suportar a opção -samefile
,
embora ambos os GNU encontrem e FreeBSD encontra apoiá-lo.
Linha Shebang
Por fim, cabe a você decidir qual usar, escrevendo a linha «shebang».
Por exemplo,
#!/bin/sh
usará sh
(e seja lá o que isso apontar),
#!/bin/bash
usará /bin/bash
se estiver disponível (e falhará com uma mensagem de erro, se não estiver). Claro, você também pode especificar outra implementação, por exemplo,
#!/bin/dash
Qual deles usar
Para meus próprios scripts, prefiro sh
pelos seguintes motivos:
- é padronizado
- é muito mais simples e fácil de aprender
- é portátil em sistemas POSIX - mesmo que eles não tenham
bash
, eles precisam tersh
Há vantagens em usar bash
também. Suas características 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 definido. A planície sh
é uma linguagem de programação muito minimalista.