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

64

Estou trabalhando em um script que automatiza a configuração de um ambiente de desenvolvimento para o desenvolvimento do Raspberry Pi (detalhes passo a passo que funcionam aqui ). O script está vinculado nesse artigo, mas você pode encontrá-lo aqui também. Agora, quando executar esse script, instale e configure o ambiente sem erros, mas você deve digitar sua senha do sudo mais de uma vez devido ao valor do tempo limite do sudo por padrão. Então comecei a experimentar removendo todas as linhas do sudo e executando o script inteiro via sudo na linha de comando da seguinte maneira:

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

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

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

Agora essa linha funcionou bem anteriormente quando não estava executando o script inteiro com o sudo. Não há nada nessa linha funcionando como sudo que deva parar de funcionar, pelo que sei, alguém tem alguma idéia?

kemra102
fonte
11
O shebang está realmente na linha 9? Devido à afinidade do Ubuntu com DashAsBinSh , suspeito que seu script seja interpretado por e dashnão bash. Tente mover o shebang na linha 1.
manatwork
De acordo com esse artigo, chamar / bin / bash diretamente em vez de / bin / sh will; use corretamente o bash em vez de traço, para que não seja um problema como eu o entendo. Ainda posso mover o shebang, é claro, mas isso realmente não explica por que funciona quando você não usa o script inteiro.
precisa saber é o seguinte
No meu caso, estava tudo bem, mas como um hábito, eu estava executando meu script de shell com "sh" e não com "bash".
Indrajeet Gour

Respostas:

82

O script não começa com uma linha shebang ; portanto, o sistema o executa /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 para ele no contexto.

Como o dash (como todos os outros shells) é um intérprete, ele não irá reclamar até que a execução atinja a linha problemática. Portanto, mesmo que o script tenha sido iniciado com êxito em algum momento do seu teste, ele seria interrompido assim que a linha 68 fosse alcançada.

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

Gilles 'SO- parar de ser mau'
fonte
2
Obrigado claramente uma lacuna no meu conhecimento, eu não escrevo muito, então não estava ciente disso! Obrigado pela explicação que ajudou muito e será muito útil saber no futuro também.
precisa saber é o seguinte
Deixe-me acrescentar que esse erro ocorre mesmo ao usar a extensão de scripts para o nautilus. A adição da linha shebang resolveu imediatamente. +1.
Bhavin Doshi # 9/13
Enfrentando o problema sonarqube.shem execução no Ubuntu 15.10. Mudou o cabeçalho como dito. Executando sudo sh ./sonar.sh console. Ainda está recebendo o erro.
soufrk 01/09/16
@soufrk É sonarqube.shou sonar.sh? Se decidir. De qualquer forma, se você não conseguir resolver o problema com as informações deste segmento, faça uma nova pergunta com o conteúdo completo do script e copie e cole as mensagens de erro completas.
Gilles 'SO- stop be evil' em
Minha culpa !! Estava executando um executável incorreto do arco. Mas, curiosamente, no arco correto, o arquivo começa com #! /bin/shexecutado perfeitamente. Agora, isso me deixa perplexo.
soufrk 1/09/16
6

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

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

A execução desse script com o sudo gerará um erro de sintaxe nas versões recentes do Ubuntu e 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 sudoassim:

    sudo bash ./pi_dev_env_install.sh
janos
fonte
1

Para mim, iniciando o script com:

bash ./< script file > 

funciona bem.

my.coolmac
fonte
Isso pode ser verdade para você, mas não é realmente uma solução para o problema declarado.
bu5hman
0

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

mauro
fonte
0

Tente dos2unix no arquivo de script. Às vezes, alguns caracteres ocultos existem na fonte.

comando:

dos2unix script_file.sh script_file.sh
M Sarfraz
fonte
0

Isso pode acontecer se você substituir o intérprete pretendido. Por exemplo, isso funcionará com sh, independentemente do hash bang usado (útil quando não estiver usando hash bang):

> sh run.sh

OU para executar o bash:

> bash run.sh

Para deixá-lo usar o valor de hash bang definido pelo script, use o seguinte:

> ./run.sh
Kc Gibson
fonte
-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
user145114
fonte
A falta de permissões não causaria essa mensagem de erro.
Gilles 'SO- stop be evil'