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?
fonte
dash
nãobash
. Tente mover o shebang na linha 1.Respostas:
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/bash
ou#!/usr/bin/env bash
.fonte
sonarqube.sh
em execução no Ubuntu 15.10. Mudou o cabeçalho como dito. Executandosudo sh ./sonar.sh console
. Ainda está recebendo o erro.sonarqube.sh
ousonar.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.#! /bin/sh
executado perfeitamente. Agora, isso me deixa perplexo.Se o shebang não estiver na primeira linha, ele não será respeitado, independentemente do shell do usuário root, da
SHELL
variável ou do-s
sinalizador. Você pode confirmar facilmente isso com um exemplo simples: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
:Mova o shebang para a primeira linha
Execute
sudo
assim:fonte
Para mim, iniciando o script com:
funciona bem.
fonte
Talvez você tenha um "(" no diretório ou no nome do arquivo.
fonte
Tente dos2unix no arquivo de script. Às vezes, alguns caracteres ocultos existem na fonte.
comando:
fonte
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):
OU para executar o bash:
Para deixá-lo usar o valor de hash bang definido pelo script, use o seguinte:
fonte
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:
fonte