Estou instalando um programa enorme, que tem seus recursos como um rpm
arquivo. Ficou preso na linha de
#!/bin/sh
SCITEGICPERLBIN=`dirname $0`
SCITEGICPERLHOME=`dirname $SCITEGICPERLBIN`
if [ $SCITEGICPERLHOME == "." ]
Aparentemente, sh
funciona bash
no Red Hat Linux com essa sintaxe, mas dá o erro de unexpected operator
no Ubuntu.
Não consigo alterar o script bash
porque o script vem do rpm
pacote. Posso extrair e reempacotar 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 possa manipular o [
operador?
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; responda “Não” ( Tabentão Enter) ebash
se tornará o padrão ( ou seja/bin/sh
, apontará para/bin/bash
).Existem vários programas que implementam a linguagem do
/bin/sh
. No Ubuntu,/bin/sh
é o dash, que é 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 do/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. 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 paradash
. Você pode torná-lo um link simbólico parabash
. As versões atuais do Debian e do Ubuntu (e derivados) tornam esta opção de instalação do dash. Para alterá-lo, executee responda “yes” para manter o traço como
/bin/sh
ou “no” para mudar para 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 do traço.Para distribuições que não possuem uma interface para escolher entre as implementações do
/bin/sh
, veja como alternar para o bash.Mantenha um terminal aberto e verifique se você ainda pode executar alguns
sh
scripts depois disso. Se você errar este comando, seu sistema ficará inutilizável. (A propósito, o motivo pelo qual usei os vários comandos acima em vez do de aparência diretasudo ln -sf bash /bin/sh
é queln -sf
não é atômico. No caso reconhecidamente improvável de seu computador travar durante esta operação, você precisará 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, mudar para traço pode causar falha nos scripts, porque o bash tem muito mais recursos do que o traço. 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 fornecidas com o bash/bin/sh
podem usar recursos específicos do bash em#!/bin/sh
scripts específicos dessa distribuição (tudo bem, desde que não haja expectativa de que os usuários pode mudar para traço como/bin/sh
e não há expectativas de que esses scripts funcionem em outra distribuição).