Echec du script shell: Erreur de syntaxe: "(" inattendu

J'ai travaillé sur un script qui automatise la mise en place d'un environnement de développement pour le développement de Raspberry Pi (détails étape par étape que le travail est ici ). Le script est lié dans cet article, mais la commodité, vous pouvez le find ici aussi. Maintenant, lors de l'exécution de 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 timeout d'attente de sudo par défaut. J'ai donc commencé à expérimenter en supprimant toutes les lignes sudo et en exécutant le script entier via sudo à la command line comme ceci:

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

Cela fonctionne bien comme prévu et obtient la plupart du time jusqu'à ce point:

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

Maintenant, cette ligne a bien fonctionné avant d'exécuter tout le script avec sudo. Il n'y a rien sur cette ligne qui fonctionne comme sudo qui devrait arrêter de fonctionner à ma connaissance, est-ce que quelqu'un a des idées?

Le script ne commence pas par une ligne shebang , donc le kernel l'exécute avec /bin/sh . Sur Ubuntu, /bin/sh est dash , un shell conçu pour un démarrage et une exécution rapides avec seulement des fonctionnalités standard. Quand le tiret atteint la ligne 68, il voit une erreur de syntaxe: cette parenthèse ne signifie rien en context.

Puisque le tiret (comme toutes les autres coquilles) est un interprète, il ne se plaindra pas tant que l'exécution n'aura pas atteint la ligne problématique. Donc, même si le script a démarré avec succès à un certain moment de votre test, il aurait avorté une fois la ligne 68 atteinte.

La ligne de shebang doit être la toute première chose dans le file. Comme vous utilisez les fonctions bash, la première ligne du file 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'user root, la variable SHELL ou le drapeau -s . Vous pouvez facilement confirmer ceci est avec un exemple simple:

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

L'exécution de ce script avec sudo provoquera 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 à la première ligne

  2. Exécutez sudo comme ceci:

     sudo bash ./pi_dev_env_install.sh 

Peut-être que vous avez un "(" sur la dir ou le nom du file.

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

order:

 dos2unix script_file.sh script_file.sh 
 sudo chmod 755 <script> 

Dans mon cas, l'erreur était l'absence d'permissions pour exécuter le file. Seulement obtenu le message d'erreur lorsque j'ai séparé les commands:

 $ sudo sh # ./install 

J'espère que cela aide