Echec du script shell: Erreur de syntaxe: “(” inattendu

64

J'ai travaillé sur un script qui automatise la configuration d'un environnement de développement pour le développement de Raspberry Pi (les détails étape par étape qui fonctionnent sont ici ). Le script est lié à cet article, mais vous pouvez le trouver ici également. Maintenant, lorsque vous exécutez ce script, installez et configurez l'environnement sans erreur, mais vous devez entrer votre mot de passe sudo plus d'une fois en raison de la valeur de délai d'expiration de sudo par défaut. J'ai donc commencé à expérimenter en supprimant toutes les lignes sudo et en exécutant l'intégralité du script via sudo à la ligne de commande, comme suit:

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

Cela fonctionne bien comme prévu et dure presque jusqu'à ce que:

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

Désormais, cette ligne fonctionnait correctement lorsque vous n'exécutiez pas tout le script avec sudo. À ma connaissance, rien dans cette ligne fonctionnant en tant que sudo ne devrait l’empêcher de fonctionner. Quelqu'un at-il des idées?

kemra102
la source
1
Le shebang est vraiment à la ligne 9? En raison de l' affinité DashAsBinSh d'Ubuntu, je suppose que votre script est interprété par dashau lieu de bash. Essayez de déplacer le shebang dans la ligne 1.
manatwork
Selon cet article, appeler directement / bin / bash au lieu de / bin / sh sera; utilisez correctement bash au lieu de dash, cela ne devrait donc pas être un problème si je comprends bien. Bien sûr, je peux toujours déplacer le shebang, mais cela n’explique pas vraiment pourquoi cela fonctionne si vous n’utilisez pas tout le script.
kemra102
Dans mon cas, tout allait bien, mais j'avais l'habitude de lancer mon script shell avec "sh" et non avec "bash".
Indrajeet Gour

Réponses:

82

Le script ne commence pas par une ligne shebang , le système l'exécute avec /bin/sh. Sur Ubuntu, /bin/shest tableau de bord , une coque conçue pour le démarrage rapide et l' exécution avec seulement des caractéristiques standard. Lorsque le tiret atteint la ligne 68, il constate une erreur de syntaxe: cette parenthèse ne signifie rien dans le contexte.

Comme dash (comme tous les autres shells) est un interprète, il ne se plaindra pas tant que l'exécution n'aura pas atteint la ligne problématique. Ainsi, même si le script avait démarré avec succès à un moment donné de vos tests, il aurait été abandonné une fois que la ligne 68 aurait été atteinte.

La ligne shebang doit être la toute première chose dans le fichier. Puisque vous utilisez les fonctionnalités bash, la première ligne du fichier doit être #!/bin/bashou #!/usr/bin/env bash.

Gilles, arrête de faire le mal
la source
2
Merci clairement une lacune dans ma connaissance, je ne sais pas beaucoup écrire, donc je n’étais pas au courant! Merci pour l'explication, cela nous a beaucoup aidé et il sera très utile de le savoir à l'avenir.
kemra102
Permettez-moi d'ajouter que cette erreur se produit même lorsque vous utilisez l'extension de scripts pour Nautilus. L'ajout de la ligne shebang a résolu le problème immédiatement. +1
Bhavin Doshi
Faire face au problème sous sonarqube.shUbuntu 15.10. Changé l'en-tête comme dit. L'exécution sudo sh ./sonar.sh console. Toujours avoir l'erreur.
soufrk
@soufrk Est-ce sonarqube.shou sonar.sh? Décidez-vous. Et de toute façon, si vous ne pouvez pas résoudre le problème avec les informations contenues dans ce fil, posez une nouvelle question avec le contenu complet du script et copiez-collez le (s) message (s) d'erreur complet (s).
Gilles, arrête d'être méchant
Ma faute !! Courait mal exécutable arch. Mais curieusement, sur le bon arch, le fichier commençant par est #! /bin/shexécuté parfaitement. Maintenant, cela me laisse perplexe.
soufrk
6

Si le shebang n'est pas sur la première ligne, il ne sera pas respecté, quel que soit le shell de l'utilisateur racine, la SHELLvariable ou le -sdrapeau. Vous pouvez facilement confirmer que ceci est avec un exemple simple:

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

L'exécution de ce script avec sudo soulèvera une erreur de syntaxe dans les versions récentes d'Ubuntu et de Debian.

Vous avez deux options pour vous assurer que le script est interprété par bash:

  1. Déplace le shebang en première ligne

  2. Courez sudocomme ça:

    sudo bash ./pi_dev_env_install.sh
janos
la source
1

Pour moi, script de départ avec:

bash ./< script file > 

fonctionne bien.

mon.coolmac
la source
C'est peut-être vrai pour vous, mais ce n'est pas vraiment une solution au problème énoncé.
bu5hman
0

Peut-être avez-vous un "(" dans le répertoire ou le nom du fichier.

mauro
la source
0

Essayez dos2unix dans un fichier script. Parfois, des caractères cachés sont présents dans la source.

commander:

dos2unix script_file.sh script_file.sh
M Sarfraz
la source
0

Cela peut arriver si vous substituez l'interprète prévu. Cela fonctionnera par exemple avec sh quel que soit le hash bang utilisé (pratique lorsque vous n'utilisez pas le hash bang):

> sh run.sh

OU pour exécuter bash:

> bash run.sh

Pour le laisser utiliser la valeur de hachage définie par le script, utilisez ceci:

> ./run.sh
Kc Gibson
la source
-1
sudo chmod 755 <script>

Dans mon cas, l'erreur était le manque d'autorisations pour exécuter le fichier. J'ai reçu le message d'erreur seulement quand j'ai séparé les commandes:

$ sudo sh
# ./install
utilisateur145114
la source
L'absence d'autorisations ne provoquerait pas ce message d'erreur.
Gilles, arrête de faire le mal