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?


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.


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

1

Pour moi, script de départ avec:

bash ./< script file > 

fonctionne bien.


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.


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

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

-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

L'absence d'autorisations ne provoquerait pas ce message d'erreur.
Gilles, arrête de faire le mal
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.