web-dev-qa-db-fra.com

Le script shell échoue: erreur de syntaxe: "(" inattendu

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é dans cet article mais pour plus de commodité, 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'attente de Sudo par défaut. J'ai donc commencé à expérimenter en supprimant toutes les lignes Sudo et en exécutant tout le script via Sudo sur la ligne de commande comme suit:

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

Cela fonctionne bien comme prévu et se poursuit jusqu'à ce point:

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

Maintenant, cette ligne fonctionnait bien auparavant lorsque vous n'exécutiez pas le script entier avec Sudo. Il n'y a rien sur cette ligne fonctionnant comme Sudo qui devrait l'empêcher de fonctionner à ma connaissance, quelqu'un a-t-il des idées?

70
kemra102

Le script ne commence pas par une ligne Shebang , donc le système l'exécute avec /bin/sh. Sur Ubuntu, /bin/sh est tiret , un shell conçu pour un démarrage et une exécution rapides avec uniquement des fonctionnalités standard. Lorsque le tiret atteint la ligne 68, il voit une erreur de syntaxe: cette parenthèse ne signifie rien pour elle dans le contexte.

Puisque dash (comme tous les autres shells) est un interpréteur, il ne se plaindra pas tant que l'exécution n'aura pas atteint la ligne problématique. Donc, même si le script avait démarré avec succès à un moment donné de votre test, il aurait été abandonné une fois la ligne 68 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/bash ou #!/usr/bin/env bash.

Si le Shebang n'est pas sur la première ligne, il ne sera pas respecté, quel que soit le Shell de l'utilisateur root, la variable Shell ou la -s drapeau. Vous pouvez facilement confirmer que c'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éplacez le Shebang vers la première ligne

  2. Exécutez Sudo comme ceci:

    Sudo bash ./pi_dev_env_install.sh
    
7
janos

Pour moi, commencer le script avec:

bash ./< script file > 

fonctionne bien.

1
my.coolmac

Vous avez peut-être un "(") sur le nom du répertoire ou du fichier.

0
mauro

Cela peut se produire si vous remplacez l'interpréteur souhaité. Par exemple, cela fonctionnera 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 bang définie par le script, utilisez ceci:

> ./run.sh
0
Kc Gibson

Essayez dos2unix dans le fichier script. Parfois, certains personnages cachés sont là dans la source.

commander:

dos2unix script_file.sh script_file.sh
0
M Sarfraz