Como usar o Bash for sh no Ubuntu

10

Estou instalando um programa enorme, que tem seus recursos como um arquivo rpm . Ficou preso na linha de

#!/bin/sh
SCITEGICPERLBIN='dirname $0'
SCITEGICPERLHOME='dirname $SCITEGICPERLBIN'
if [ $SCITEGICPERLHOME == "." ]

Aparentemente, sh trabalha para bash no Red Hat Linux com esta sintaxe, mas dá o erro de unexpected operator no Ubuntu.

Não consigo alterar o script para bash , pois o script vem do pacote rpm . Eu posso extrair e empacotar novamente o pacote rpm , mas pode haver muitos desses scripts.

Existe uma maneira de alterar o padrão do shell para tratar #!/bin/sh como bash ou qualquer outra coisa, que possa manipular o operador [ ?

    
por Googlebot 08.05.2018 / 13:08

2 respostas

18

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).

    
por 08.05.2018 / 13:33
35

Para alternar sh para bash (em vez de dash , o padrão), reconfigure dash (sim, é um pouco contra-intuitivo):

sudo dpkg-reconfigure dash

Isso perguntará se você deseja que dash seja o shell padrão do sistema; responda “Não” ( Tab então Enter ) e bash se tornará o padrão ( ie /bin/sh apontará para /bin/bash ).

    
por 08.05.2018 / 13:26