Existem vários programas que implementam o idioma de /bin/sh
. No Ubuntu, /bin/sh
é dash, que é projetado para ser rápido, usar uma pequena quantidade de memória e não suporta muito mais do que o mínimo esperado de /bin/sh
. No RHEL, /bin/sh
é bash, que é mais lento e usa mais memória, mas possui mais recursos. Um desses recursos é o operador ==
da sintaxe condicional [
. O Dash suporta [
, que é um recurso sh básico, mas não possui o operador ==
que é uma extensão bash (e ksh e zsh).
Você pode mudar seu sistema para usar o bash. No Ubuntu, /bin/sh
é um link simbólico para dash
. Você pode torná-lo um link simbólico para bash
. Versões atuais do Debian e Ubuntu (e derivados) tornam esta opção de instalação do dash. Para alterá-lo, execute
sudo dpkg-reconfigure dash
e responda "yes" para manter o traço como /bin/sh
ou "no" para mudar para o bash.
Você pode manter o bash como /bin/sh
, mas isso tornará seu sistema um pouco mais lento. É até concebível que algum script do sistema seja incompatível com o bash, embora isso seja improvável, já que o bash é principalmente um superconjunto de traços.
Para distribuições que não têm uma interface para escolher entre as implementações de /bin/sh
, veja como mudar para o bash.
sudo ln -s bash /bin/sh.bash
sudo mv /bin/sh.bash /bin/sh
Mantenha um terminal aberto e verifique se ainda é possível executar alguns scripts sh
depois disso. Se você estragar este comando, isso tornará seu sistema inutilizável. (By the way, a razão que eu usei os vários comandos acima, em vez de o simples olhar sudo ln -sf bash /bin/sh
é que ln -sf
não é atômica. No caso improvável seu computador caiu durante esta operação, você precisa arrancar a partir de mídia de resgate para restaurá-lo. Em contraste, mv
é atômico.)
Para restaurar o traço como /bin/sh
:
sudo ln -s dash /bin/sh.dash
sudo mv /bin/sh.dash /bin/sh
Observe que, se sh for /bin/bash
, por padrão, em sua distribuição, a mudança para dash poderá fazer com que os scripts falhem, porque o bash tem muito mais recursos que o dash. Os scripts bash devem começar com #!/bin/bash
e os scripts que começam com #!/bin/sh
não devem usar recursos específicos do bash, mas as distribuições que acompanham o bash como /bin/sh
podem usar recursos específicos do bash em #!/bin/sh
scripts específicos desse distribuição (tudo bem, desde que não haja expectativa de que os usuários possam mudar para dash como /bin/sh
e não há expectativas de que esses scripts funcionem em outra distribuição).