Como usar o Bash para sh no Ubuntu

13

Estou instalando um programa enorme, que tem seus recursos como um rpmarquivo. Ele ficou preso na linha de

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

Aparentemente, shtrabalhe bashno Red Hat Linux com esta sintaxe, mas isso indica o erro do unexpected operatorUbuntu.

Não consigo alterar o script para, bashpois o script vem do rpmpacote. Posso extrair e reembalar o rpmpacote, mas pode haver muitos desses scripts.

Existe uma maneira de alterar o padrão do shell para tratar #!/bin/shcomo bashou qualquer outra coisa, que pode manipular o [operador?

Googlebot
fonte
5
A única coisa errada é a ==que deveria ser =. Isso e que as expansões variáveis ​​devem ser citadas duas vezes.
Kusalananda
4
[não é um operador, mas um comando interno chamado test. O operador inesperado é ==e isso deve ser substituído por =não ser compatível com POSIX.
schily
A segunda única coisa errada é que $SCITEGICPERLHOMEdeve ser citada.
l0b0
12
Você deve reclamar com o autor do programa. Se eles usarem #!/bin/sh, devem garantir que eles usem apenas recursos de shell POSIX, não bashextensões. Este programador é muito desleixado. Ele deve corrigir seu código ou usar #!/bin/bash.
Barmar
Para as pessoas que se perguntam sobre outros problemas semelhantes, aqui está uma lista de " Bashisms ". Veja também esta pergunta .
Captain Man

Respostas:

21

Existem vários programas que implementam o idioma de /bin/sh. No Ubuntu, o /bin/shdash é projetado para ser rápido, para usar uma pequena quantidade de memória e não suporta muito mais do que o mínimo esperado /bin/sh. No RHEL, /bin/shé o bash, que é mais lento e usa mais memória, mas tem mais recursos. Um desses recursos é o ==operador para a [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 o bash. No Ubuntu, /bin/shé um link simbólico para dash. Você pode transformá-lo em um link simbólico bash. As versões atuais do Debian e Ubuntu (e derivados) fazem desta uma opção de instalação do dash. Para mudar, execute

sudo dpkg-reconfigure dash

e responda "yes" para manter o traço como /bin/shou "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, pois o bash é principalmente um superconjunto de traços.


Para distribuições que não têm uma interface para escolher entre 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 você ainda pode executar alguns shscripts depois disso. Se você errar esse comando, o sistema ficará inutilizável. (A propósito, o motivo pelo qual usei os vários comandos acima, e não o direto, sudo ln -sf bash /bin/shé que ln -sfnão é atômico. No caso reconhecidamente improvável de o seu computador travar durante esta operação, você precisa inicializar a partir da 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 estiver /bin/bashpor padrão em sua distribuição, a mudança para o dash pode causar falha nos scripts, porque o bash possui muito mais recursos que o dash. Os scripts bash devem começar #!/bin/bashe os scripts iniciados com #!/bin/shnão devem usar recursos específicos do bash, mas as distribuições que acompanham o bash /bin/shpodem usar recursos específicos do bash em #!/bin/shscripts específicos para essa distribuição (tudo bem, desde que não haja expectativa de que os usuários pode mudar para o dash como /bin/she não há expectativas de que esses scripts funcionem em outra distribuição).

Gilles 'SO- parar de ser mau'
fonte
Na minha opinião não tão humilde, se algum script falha quando /bin/shé o Bash, é um bug no sistema (o pacote com o script) ou no modo-Bash sh. Como Stephen diz, o sistema permite explicitamente /bin/shretornar ao Bash, via dpkg-reconfigure. Também é mencionado como uma possibilidade no wiki do Ubuntu sobre este assunto: wiki.ubuntu.com/DashAsBinSh
ilkkachu
5
@ilkkachu Sim, se um script falhar se /bin/shfor bash, é um bug. No entanto, erros acontecem. Eu recomendo manter o padrão se você não for capaz e estiver disposto a diagnosticar esses erros, porque outras pessoas o testaram para você. Eu usei o dash como /bin/shantes, pois ele era oficialmente suportado no Debian, mas esse era um risco que eu corria, sabendo que seria capaz de lidar se algo acontecesse.
Gilles 'SO- stop be evil'
Observe que links simbólicos substituídos manualmente serão restaurados para qualquer configuração armazenada na debconfpróxima vez que dashfor atualizada; é certo que isso não acontecerá frequentemente (se houver, em um determinado release) para sistemas executando o Debian estável.
Stephen Kitt
36

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

sudo dpkg-reconfigure dash

Isso perguntará se você deseja dashser o shell do sistema padrão; responder “Não” ( Tabem seguida Enter) e bashvai se tornar o padrão em vez ( ou seja, /bin/sh irá apontar para /bin/bash).

Stephen Kitt
fonte
1
Sua solução é realmente a mais razoável, mas aceitei outra resposta por causa de descrições detalhadas que esclarecem o problema. Desculpe por qualquer inconveniente.
Googlebot
@Googlebot não precisa se desculpar, escolher a resposta aceita é um privilégio do solicitante. E eu ganhei um distintivo dourado ;-).
Stephen Kitt