Contenu | Rechercher | Menus

Annonce

La nouvelle clé USB Ubuntu-fr est en prévente
Rendez-vous sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/07/2019, à 21:08

Jarodd

[Résolu] Syntax error à l'exécution d'un script

Bonjour,

J'essaye de me faire un script de sauvegarde, qui place quelques fichiers dans un dossier et zippe ce dossier.

#!/bin/bash

src_firefox="/home/jarodd/.mozilla/firefox/t4rh7p9b.default-release"
dst_firefox="/home/jarodd/Bureau/firefox"
mkdir -p "$dst_firefox"
files=( "places.sqlite" "key4.db" "logins.json" "permissions.sqlite" "search.json.mozlz4" "cert9.db" )
for f in "${files[@]}"
do
  cp -p "$src_firefox/$f" $dst_firefox 2>/dev/null
done

Le dossier est bien créé, ensuite j'ai cette erreur :

script.sh: 6: script.sh: Syntax error: "(" unexpected

Cette ligne correspond à :

files=( "places.sqlite" "key4.db" "logins.json" "permissions.sqlite" "search.json.mozlz4" "cert9.db" )

Si je supprime cette ligne, je n'ai plus d'erreur (j'ai mis des echo à la suite pour vérifier l'exécution).

L'erreur se produit quand le script est exécuté par un cron quotidien.
Or si je lance le script en faisant ./mon_script.sh, il va bien jusqu'au bout, sans erreur.

Est-ce un problème de syntaxe ? J'ai testé en enlevant les espaces avant et après les parenthèses, cela n'a rien changé.

Merci pour votre aide.

Edit 12/07 : résolu, dans la crontab il faut ajouter /bin/bash avant le chemin du fichier pour que ce soit bash (et non dash) qui exécute le script

Dernière modification par Jarodd (Le 12/07/2019, à 15:26)


Ubuntu 18.04 LTS (64 bits)

Hors ligne

#2 Le 12/07/2019, à 01:47

kamaris

Re : [Résolu] Syntax error à l'exécution d'un script

Ton script doit être exécuté par sh (qui pointe vers /bin/dash) qui ne connait pas cette syntaxe. Essaie de faire

sh script.sh

tu vas avoir la même erreur.

Hors ligne

#3 Le 12/07/2019, à 08:02

MicP

Re : [Résolu] Syntax error à l'exécution d'un script

Bonjour

Une solution consiste à modifier dans ce script la variable SHELL
en ajoutant, juste en dessous du shebang :

#!/bin/bash

une ligne contenant :

SHELL=/bin/bash

Ce qui permettra à toutes les commandes présentes dans ton script
d'être interprétées par /bin/bash

Dernière modification par MicP (Le 12/07/2019, à 09:22)

Hors ligne

#4 Le 12/07/2019, à 09:25

Watael

Re : [Résolu] Syntax error à l'exécution d'un script

effectivement, cela ressemble à un script dont les extensions ne seraient pas reconnues par un shell "plus POSIX".

l'assignation indiquée s par MicP erait à mettre au début de la crontab, mais ça ne changera rien ici.
le shebang suffit à indiquer au noyau quel programme utiliser pour exécuter les commandes indiquées.

Jarodd peut-il nous montrer sa crontab ?

PS: le tableau* et la boucle sont inutiles :

cp -p -t " $dst_firefox/" "$src_firefox"/{{permissions,places}.sqlite,logins.json,search.json.mozlz4,{key4,cert9}.db}

mais ce n'est pas davantage POSIX wink

*à moins que tu t'en serves plus tard dans le script

Dernière modification par Watael (Le 12/07/2019, à 09:30)


eval, c'est mal.

Hors ligne

#5 Le 12/07/2019, à 09:38

Jarodd

Re : [Résolu] Syntax error à l'exécution d'un script

@kamaris : oui manuellement avec sh j'ai la même erreur.

@MicP : j'ai la même erreur en ajoutant la ligne. C'est bien ça que tu proposes ?

#!/bin/bash
SHELL=/bin/bash

@Watael :
Ma crontab :

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m     h       dom     mon     dow   command
30      20      *       *       *     /home/jarodd/Documents/scripts.sh

Pour le tableau et la boucle, je suis vraiment débutant, je suis sûr qu'on peut améliorer chaque ligne du script wink Mais ma priorité est qu'il se lance bien.

Merci pour votre aide !


Ubuntu 18.04 LTS (64 bits)

Hors ligne

#6 Le 12/07/2019, à 10:01

MicP

Re : [Résolu] Syntax error à l'exécution d'un script

Watael a écrit :

…l'assignation indiquée par MicP serait à mettre au début de la crontab…

C'est effectivement ce qui se fait,
mais j'avais préféré limiter la portée de cette modification au seul script concerné
plutôt que d'imposer bash à toutes les lignes déjà présentes et futures de la crontab.

=======

Jarodd a écrit :

… j'ai la même erreur en ajoutant la ligne …

J'avais testé avec succès cette solution mais seulement sur un système debian
(en ce moment, je n'ai pas de système Ubuntu "sous la main")

Jarodd a écrit :

… C'est bien ça que tu proposes ? …

OUI, c'est exactement la modification que j'avais proposé.

Dernière modification par MicP (Le 12/07/2019, à 10:16)

Hors ligne

#7 Le 12/07/2019, à 10:16

kamaris

Re : [Résolu] Syntax error à l'exécution d'un script

C'est une erreur qu'on trouve à divers endroits sur le web : https://askubuntu.com/questions/117978/ … standalone, https://unix.stackexchange.com/question … de-cronjob
Une solution est d'indiquer explicitement l'utilisation de bash dans ta crontab, par

/bin/bash /home/jarodd/Documents/scripts.sh

Hors ligne

#8 Le 12/07/2019, à 10:31

Jarodd

Re : [Résolu] Syntax error à l'exécution d'un script

Merci, mon cron de test de 10h30 a fonctionné smile

Faut-il que je laisse le SHELL=/bin/bash en ligne 2 du script ?

Sinon je n'ai pas compris pourquoi j'ai eu cette erreur... Pourquoi les parenthèses seraient "unexpected", alors que le script fonctionne bien en le lançant par ./ ?

Dernière modification par Jarodd (Le 12/07/2019, à 10:32)


Ubuntu 18.04 LTS (64 bits)

Hors ligne

#9 Le 12/07/2019, à 11:05

kamaris

Re : [Résolu] Syntax error à l'exécution d'un script

Non, tu peux enlever SHELL=/bin/bash de ton script.

Quand tu lances ton script par ./, le shebang (#! au début de ton script) est consulté pour savoir quel interpréteur utiliser pour exécuter le script. Lorsqu'un shell est explicitement appelé pour l'interpréter (comme dans /bin/sh script.sh ou /bin/bash script.sh), le shebang est ignoré. Cf. par exemple https://unix.stackexchange.com/question … the-script

Quand le script est exécuté via la crontab, c'est manifestement /bin/sh qui est appelé par défaut. Or /bin/sh pointe vers /bin/dash (regarde la sortie de ls -l /bin/sh), et dash ne connait pas cette syntaxe en ligne 6 du script (cf. man dash, à comparer avec man bash).

Hors ligne

#10 Le 12/07/2019, à 15:25

Jarodd

Re : [Résolu] Syntax error à l'exécution d'un script

Merci pour ces explications smile


Ubuntu 18.04 LTS (64 bits)

Hors ligne

#11 Le 12/07/2019, à 16:16

Watael

Re : [Résolu] Syntax error à l'exécution d'un script

Quand le script est exécuté via la crontab, c'est manifestement /bin/sh qui est appelé par défaut.

cela ne doit concerner que les commandes sur la ligne de la crontab; les scripts doivent respecter le shebang, comme lorsque tu ouvres /bin/dash et que tu exécutes un script exécutable bash : c'est le shebang qui prévaut.


eval, c'est mal.

Hors ligne