Estou instalando um programa enorme, que tem seus recursos como um rpm
arquivo. Ele ficou preso na linha de
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Aparentemente, sh
trabalhe bash
no Red Hat Linux com esta sintaxe, mas isso indica o erro do unexpected operator
Ubuntu.
Não consigo alterar o script para, bash
pois o script vem do rpm
pacote. Posso extrair e reembalar o rpm
pacote, 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 pode manipular o [
operador?
==
que deveria ser=
. Isso e que as expansões variáveis devem ser citadas duas vezes.[
não é um operador, mas um comando interno chamadotest
. O operador inesperado é==
e isso deve ser substituído por=
não ser compatível com POSIX.$SCITEGICPERLHOME
deve ser citada.#!/bin/sh
, devem garantir que eles usem apenas recursos de shell POSIX, nãobash
extensões. Este programador é muito desleixado. Ele deve corrigir seu código ou usar#!/bin/bash
.Respostas:
Existem vários programas que implementam o idioma de
/bin/sh
. No Ubuntu, o/bin/sh
dash é 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 paradash
. Você pode transformá-lo em um link simbólicobash
. As versões atuais do Debian e Ubuntu (e derivados) fazem desta uma opção de instalação do dash. Para mudar, executee 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, 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.Mantenha um terminal aberto e verifique se você ainda pode executar alguns
sh
scripts 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
é queln -sf
nã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
:Observe que se sh estiver
/bin/bash
por 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/bash
e os scripts iniciados com#!/bin/sh
não devem usar recursos específicos do bash, mas as distribuições que acompanham o bash/bin/sh
podem usar recursos específicos do bash em#!/bin/sh
scripts 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/sh
e não há expectativas de que esses scripts funcionem em outra distribuição).fonte
/bin/sh
é o Bash, é um bug no sistema (o pacote com o script) ou no modo-Bashsh
. Como Stephen diz, o sistema permite explicitamente/bin/sh
retornar ao Bash, viadpkg-reconfigure
. Também é mencionado como uma possibilidade no wiki do Ubuntu sobre este assunto: wiki.ubuntu.com/DashAsBinSh/bin/sh
for 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/sh
antes, pois ele era oficialmente suportado no Debian, mas esse era um risco que eu corria, sabendo que seria capaz de lidar se algo acontecesse.debconf
próxima vez quedash
for atualizada; é certo que isso não acontecerá frequentemente (se houver, em um determinado release) para sistemas executando o Debian estável.Para mudar
sh
parabash
(em vez dedash
, o padrão), reconfiguredash
(sim, é um pouco contra-intuitivo):Isso perguntará se você deseja
dash
ser o shell do sistema padrão; responder “Não” ( Tabem seguida Enter) ebash
vai se tornar o padrão em vez ( ou seja,/bin/sh
irá apontar para/bin/bash
).fonte