Resumindo:
-
Existem vários shells que implementam um superconjunto de a especificação sh POSIX . Em sistemas diferentes,
/bin/sh
pode ser um link para ash, bash, dash, ksh, zsh, & c. (Ele sempre será compatível com sh - nunca csh ou peixe). -
Contanto que você use apenas
sh
, você pode (e provavelmente deve) usar#!/bin/sh
e o script deve funcionar bem, não importando qual seja a shell. -
Se você começar a usar recursos específicos do bash (por exemplo, arrays), deverá solicitar especificamente o bash - porque, mesmo que
/bin/sh
já invoque o bash no seu sistema, talvez não todos os outros sistema, e seu script não será executado lá. (O mesmo se aplica a zsh e ksh.) Você pode usar o shellcheck para identificar os bashisms. -
Mesmo que o script seja apenas para uso pessoal, talvez você perceba que alguns sistemas operacionais alteram
/bin/sh
durante as atualizações. no Debian costumava ser bash, mas depois foi substituído por um mínimo de traço. Scripts que usavam bashisms, mas tinham#!/bin/sh
de repente quebraram.
No entanto:
-
Mesmo
#!/bin/bash
não está muito correto. Em sistemas diferentes, o bash pode estar em/usr/bin
ou/usr/pkg/bin
ou/usr/local/bin
. -
Uma opção mais confiável é
#!/usr/bin/env bash
, que usa $ PATH. (Embora a ferramentaenv
em si não seja estritamente garantida, o/usr/bin/env
ainda funciona em mais sistemas do que o/bin/bash
).