#1 Le 01/07/2007, à 19:19
- Strash
Un script bash qui ne marche subitement plus ??
Un script bash de ma fabrication permettant de synchroniser de façon assez particulière mon Archos avec le PC ne fonctionne plus depuis aujourd'hui (il fonctionnais très bien la semaine dernière)
L'erreur renvoyée lorsque je le lance dans un terminal est :
$./autorun.sh
./autorun.sh: 1: Syntax error: Bad substitution
J'ai lu sur internet que cette erreur pouvais être due à la version de bash utilisée... hors ça fonctionnais très bien sur le même PC la semaine dernière ? Et je n'ai pas changé de distribution entre les deux !
(La seule chose que j'ai fait c'est changer de pilotes graphiques (de radeon à fglrx) grâce à Envy, mais ça n'a pas vraiment de rapport...)
voici le script au cas où :
#!/bin/sh
# Script de synchronisation des podcasts sur l'Archos v2.3
# Par Pierre MAURIER
# Commencé le 19/05/07
# Historique des versions
# v1.0 le 20/05/07 : création du script, choix des actions une à une par une question zenity
# v2.0 le 21/05/07 : Choix des actions dans une liste
# v2.1 le 21/05/07 : Correction de bug :
# - Cache les entrées des miniatures ARCHOS dans la liste historique (pb de miniatures non supprimés qui pouvaient passer pour les fichiers supprimés)
# Feature :
# - Affichage d'une info lorsqu'il n'y a rien à faire
# v2.2 le 22/05/07 : Correction de bug :
# - Pb du au dossier _arcthumb dans la racine des podcasts
# v2.3 le 28/05/07 : Lancement de Nautilus sur le dossier de l'Archos à la demande à la fin du script (pour le démonter ou juste naviguer dedans)
MOUNTPOINT_ARCHOS=/media/A604WIFI
DOS_PODCASTS=~/telechargements/podcasts
DOS_ARCHOS=$MOUNTPOINT_ARCHOS/Video/podcast
#DOS_PODCASTS=~/telechargements/testpod
#DOS_ARCHOS=~/telechargements/testpod2
FICHIER_HISTO=$DOS_PODCASTS/histo
#####################################################
# Détecte un premier lancement et crée le FICHIER_HISTO
if [ ! -e $FICHIER_HISTO ]
then
echo "Création du fichier historique"
ls -R $DOS_ARCHOS --hide=*.ATF > $FICHIER_HISTO
else
######################################################
#Crée les répertoires manquants
# Pour chaque fichier du répertoire
for dossier in `ls $DOS_PODCASTS`
do
# Si c'est un dossier
if [ -d $DOS_PODCASTS/$dossier ]
then
# et s'il n'existe pas déjà
if [ ! -e $DOS_ARCHOS/$dossier ]
then
# Le créer
echo "création du dossier $dossier"
mkdir $DOS_ARCHOS/$dossier
fi
fi
done
########################################################
#Marque les fichiers à supprimer de l'Archos mais toujours présents sur le PC
#et marque les copies des nouveaux dans le PC
#puis marque les suppressions des fichiers présents dans l'Archos mais pas sur le PC
#et marque les copies des nouveaux dans l'Archos (improbable...)
suppression=""
copie=""
numaction=0
# Pour chaque fichier du répertoire du PC
for dossier in `ls $DOS_PODCASTS`
do
# Si c'est un dossier
if [ -d $DOS_PODCASTS/$dossier ]
then
# Pour chaque fichier de ce sous répertoire
for fichiers in `ls $DOS_PODCASTS/$dossier/`
do
# Si le fichier n'est pas présent dans l'Archos
# que ce n'est pas un répertoire
if [ ! -e "$DOS_ARCHOS/$dossier/$fichiers" ] && [ ! -d $DOS_PODCASTS/$dossier/$fichiers ]
then
# et qu'il était présent au dernier upload
if [[ ! `cat $FICHIER_HISTO | grep $fichiers` == "" ]]
then
#Le marquer pour la suppression (car il a été regardé sur l'Archos)
#echo supprimer $DOS_PODCASTS/$dossier/$fichiers
let "numaction+=1"
suppression=$suppression"TRUE $numaction supprimer $fichiers $DOS_PODCASTS/$dossier/ "
actions[numaction]="supprimer $fichiers $DOS_PODCASTS/$dossier/"
else
#Le marquer pour le transfert (car il est nouveau)
#echo copier $DOS_PODCASTS/$dossier/$fichiers dans $DOS_ARCHOS/$dossier/
let "numaction+=1"
copie=$copie"TRUE $numaction copie $fichiers $DOS_ARCHOS/$dossier/ "
actions[numaction]="copier $DOS_PODCASTS/$dossier/$fichiers $DOS_ARCHOS/$dossier/"
fi
fi
done
fi
done
# Pour chaque fichier du répertoire de l'ARCHOS
for dossier in `ls $DOS_ARCHOS`
do
# Si c'est un dossier mais que ce n'est pas le dossier des miniatures
if [ -d $DOS_ARCHOS/$dossier ] && [[ ! $dossier == "_arcthumb" ]]
then
# Pour chaque fichier de ce sous répertoire
for fichiers in `ls $DOS_ARCHOS/$dossier/`
do
# Si le fichier n'est pas présent dans le PC
# que ce n'est pas un répertoire
echo $DOS_ARCHOS/$dossier/$fichiers
if [ ! -e "$DOS_PODCASTS/$dossier/$fichiers" ] && [ ! -d $DOS_ARCHOS/$dossier/$fichiers ]
then
# et qu'il était présent au dernier upload
if [[ ! `cat $FICHIER_HISTO | grep $fichiers` == "" ]]
then
#Le marquer pour la suppression (car il a été regardé sur le PC)
#echo supprimer $DOS_ARCHOS/$dossier/$fichiers
let "numaction+=1"
suppression=$suppression"TRUE $numaction supprimer $fichiers $DOS_ARCHOS/$dossier/ "
actions[numaction]="supprimer $fichiers $DOS_ARCHOS/$dossier/"
else
#Le marquer pour le transfert (car il est nouveau) (peu probable, l'Archos ne télécharge pas de fichiers)
#echo copier $DOS_ARCHOS/$dossier/$fichiers dans $DOS_PODCASTS/$dossier/
let "numaction+=1"
copie=$copie"TRUE $numaction copie $fichiers $DOS_PODCASTS/$dossier/ "
actions[numaction]="copier $DOS_ARCHOS/$dossier/$fichiers $DOS_PODCASTS/$dossier/"
fi
fi
done
fi
done
# Si il y a au moins une action
if [[ $numaction > 0 ]]
then
#Affichage du choix
listeok=`zenity --list --title="Mise à jour des podcasts" --text="Sélectionner les actions à effectuer" --width=1000 --height=300 --checklist --column="" --column="ID" --column="Action" --column="Fichier" --column="Dossier" $suppression $copie`
#Exécution des actions sélectionnés
listeok=`echo $listeok | tr "|" " "`
#Compte le nombre d'actions sélectionnés
nbractions=0
for action in $listeok
do
let "nbractions+=1"
done
(
progress=0
i=0
# Pour chaque action sélectionné
for action in $listeok
do
let "progress += 100/$nbractions"
let "i += 1"
# Déterminer son type et effectuer l'action
if [[ `echo ${actions[action]} | awk '{print $1}'` == "supprimer" ]]
then
echo "# Suppression de "`echo ${actions[action]} | awk '{print $3$2}'`"\naction $i/$nbractions"
rm `echo ${actions[action]} | awk '{print $3$2}'`
else
echo "# Copie de "`echo ${actions[action]} | awk '{print $2" vers "$3}'`"\naction $i/$nbractions"
cp `echo ${actions[action]} | awk '{print $2" "$3}'`
fi
# Augmenter la barre de progression
echo $progress
done
) |
zenity --progress --title="Mise à jour des podcasts" --text="Action" --auto-close --percentage=0
#Mise à jour du fichier historique
ls -R $DOS_ARCHOS --hide=*.ATF > $FICHIER_HISTO
else
zenity --info --text="Aucune mise à jour à faire sur les podcasts de l'Archos" --title="Mise à jour des podcasts"
fi
fi
#Propose d'ouvrir Nautilus
zenity --question --title="Mise à jour des podcasts" --text="Ouvrir Nautilus ?"
if [[ $? == 0 ]]
then
nautilus $MOUNTPOINT_ARCHOS &
fi
exit 0
Merci
Hors ligne
#2 Le 01/07/2007, à 19:40
- jtlb
Re : Un script bash qui ne marche subitement plus ??
tu as fait des mises à jours? je croix que l'interpréteur de commande a changé: avant cétait bash, maintenant c'est dash.
essaye de mettre
#!/bin/bash
à la place #!/bin/sh
On n'est jamais à l'abri d'un coup de bol!
Hors ligne
#3 Le 02/07/2007, à 02:54
- Strash
Re : Un script bash qui ne marche subitement plus ??
Merci, c'était ça l'erreur...
Par contre pourquoi ont-il changé l'interpréteur comme ça ? C'est un peu brutal... ça me semble bizarre, vu que normalement ils ne font pas de changement de version majeure de logiciel pendant la vie d'une version, ça peut pas poser de gros problèmes sur certains scripts ?
Hors ligne
#4 Le 02/07/2007, à 08:56
- Link31
Re : Un script bash qui ne marche subitement plus ??
Ça pose des problèmes lorsque le script utilise des bashismes (une syntaxe propre à bash), alors que l'interpréteur indiqué en première ligne est le shell de base (sh). C'est de la responsabilité de l'auteur du script d'indiquer l'interpréteur correct. Si le script ne fonctionne pas à cause de ça, ce n'est pas la faute des mainteneurs de la distribution.
Dernière modification par Link31 (Le 02/07/2007, à 08:57)
Hors ligne