O script da shell falha: Erro de sintaxe: “(” inesperado

53

Eu tenho trabalhado em um script que automatiza a criação de um ambiente de desenvolvimento para o desenvolvimento do Raspberry Pi (detalhes passo a passo que funcionam são aqui ). O script está vinculado nesse artigo, mas você pode encontrá-lo com conveniência aqui também. Agora, quando executar este script, instale e configure o ambiente sem erros, mas você terá que digitar sua senha sudo mais de uma vez, devido ao valor de tempo limite do sudo, por padrão. Então eu comecei a experimentar removendo todas as linhas do sudo e rodando todo o script via sudo na linha de comando assim:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

Isso funciona bem como esperado e passa a maior parte do caminho até este ponto:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

Agora esta linha funcionou bem quando não estava rodando o script inteiro com o sudo. Não há nada sobre esta linha rodando como sudo que deve parar de funcionar ao meu conhecimento, alguém tem alguma idéia?

    
por kemra102 18.08.2012 / 13:37

6 respostas

73

O script não começa com uma linha shebang , portanto, o sistema o executa com /bin/sh . No Ubuntu, /bin/sh é dash , um shell projetado para inicialização e execução rápidas com apenas recursos padrão. Quando o traço atinge a linha 68, ele vê um erro de sintaxe: esse parêntese não significa nada no contexto.

Como o traço (como todos os outros shells) é um interpretador, ele não irá reclamar até que a execução atinja a linha problemática. Portanto, mesmo que o script tenha iniciado com sucesso em algum momento do seu teste, ele teria sido cancelado quando a linha 68 fosse atingida.

A linha shebang deve ser a primeira coisa no arquivo. Como você usa recursos bash, a primeira linha do arquivo deve ser #!/bin/bash ou #!/usr/bin/env bash .

    
por 18.08.2012 / 14:08
5

Se o shebang não estiver na primeira linha, ele não será respeitado, independentemente do shell do usuário raiz, da variável SHELL ou do -s . Você pode facilmente confirmar isso com um exemplo simples:

#
#!/bin/bash
offfset=('ls')
echo $offset

A execução deste script com o sudo causará um erro de sintaxe nas versões recentes do Ubuntu e do Debian.

Você tem duas opções para garantir que o script seja interpretado por bash :

  1. Mova o shebang para a primeira linha

  2. Execute sudo da seguinte forma:

    sudo bash ./pi_dev_env_install.sh
    
por 18.08.2012 / 14:11
0

Talvez você tenha um "(" no diretório ou no nome do arquivo.

    
por 22.01.2013 / 23:34
0

Experimente o dos2unix no arquivo de script. Às vezes, alguns caracteres ocultos estão lá na fonte.

comando:

dos2unix script_file.sh script_file.sh
    
por 24.04.2015 / 07:26
-1
sudo chmod 755 <script>

No meu caso, o erro foi a falta de permissões para executar o arquivo. Só recebi a mensagem de erro quando separei os comandos:

$ sudo sh
# ./install

espero que ajude

    
por 27.11.2015 / 23:00
-1

Para mim, começar o script com:

bash ./< script file > 

funciona bem.

    
por 24.12.2017 / 12:00