Problems with Bash 4.2.45 no Ubuntu

0

Estou usando um servidor remot executando o Ubuntu 13.10 com o Bash 4.2.45 instalado. Meu sistema home é o OS X Mavericks com o Bash 3.2.51 (Darwin build) instalado. Eu não usei bash muito no passado, mas eu tenho trabalhado em um script muito grande e notei algumas coisas que eram estranhas sobre a versão instalada no servidor remoto.

Pegue um script simples, por exemplo:

#!/bin/sh

read n

if ((n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi

Enquanto sob o bash 3.2.51 ele reconhece a expressão e trabalha sob o bash 4 no Ubuntu, isso gera um erro estranho:

script.sh: 5: script.sh: n: not found

Mas não são apenas ((...)) não reconhecidos, mas algumas vezes variáveis e outras declarações lógicas. Como um novato bash é muito confuso e eu queria perguntar o que eu poderia fazer sobre isso. Posso alterar as regras de sintaxe? Ou apenas rebaixar o servidor remoto para uma versão 3.x.y? Qualquer ajuda é apreciada.

    
por AreusAstarte 02.01.2014 / 21:30

3 respostas

4

Quando eu li sua consulta, fiquei surpreso com o comportamento que você tem, então eu decidi reproduzi-lo rapidamente, então eu configurei um novo Ubuntu 13.10 VM com Bash versão 4.2.45.

Uma vez feito isso, eu consegui reproduzir o comportamento que você descreve.

Depois de mais investigações, parece que você precisa substituir #!/bin/sh por #!/bin/bash para que funcione.

Editar:

Para iniciar o script:

  • bash script.sh e ./script.sh funcionarão.
  • sh script.sh não funcionará.

Supondo que você tenha #!/bin/bash na primeira linha

Espero que funcione para você!

    
por 02.01.2014 / 23:55
2

Você não está usando o Bourne Again Shell.

É um erro assumir que /bin/sh é algo mais do que um shell compatível com POSIX. (Mesmo se fosse bash, quando bash é invocado como sh sutilmente muda seu comportamento.) No Ubuntu, /bin/sh agora é padronizado para o Debian Almquist Shell, que é um diferente shell - uma das muitas conchas (Thompson, Bourne, Bourne, Almquist, Korn, Z, Friendly Interactive, C, Tenex C, BusyBox, Política compatível com o Ordinary,…) que se pode encontrar no Unix e no Linux sistemas. A mudança de /bin/sh do Bourne Again para o Debian Almquist melhorou a velocidade de inicialização dos sistemas Debian e Ubuntu, que executam um lote de scripts shell como parte do processo de inicialização.

Se você realmente quiser usar bashisms como (()) em seu script, defina explicitamente /bin/bash como o interpretador de scripts em sua linha #! .

Por outro lado, se você quiser especificar /bin/sh como seu interpretador de scripts em sistemas tão diversos quanto o Mac OS e o Linux, siga estritamente apenas o que estiver em conformidade com POSIX.

Leitura adicional

por 03.01.2014 / 00:10
0

n é uma variável, então você precisa referenciá-la usando um "$":

#!/bin/sh

read n

if (($n > 10)); then
        echo "Number is pretty big"
else
        echo "NUMBER IS WEAK AND SMALL"
fi
    
por 02.01.2014 / 23:59