#1 Le 20/04/2012, à 10:28
- Christophe C
[résolu] passer des variables externes dans un script bash
Bon, après pas mal de temps passé dessus, je sèche. J'ai un script qui ne marche pas. Le cht'i salaud devrait, pourtant.
Le script change le papier peint sous lxde. Il fait appel à un fichier de config qui contient les variables.
Le fichier lxde-wallpaper.txt, qui contient mes variables :
DUREE=1m
REP=/home/chris/Images
Mon script : lxde-wallpaper.sh
#!/bin/bash
while : #début boucle sans fin
do
while read ligne
do
pcmanfm -w "$ligne" #change le papier peint.
source /home/chris/Documents/Scripts/lxde-wallpaper/lxde-wallpaper-data.txt
sleep $DUREE
done < <(find $REP/ | grep -iE "jpg|png|gif" | sort -R)
done
Le sleep $DUREE marche nickel.
le done < <(find $REP/ ne marche pas. Le find tourne sur la totalité des répertoires, il ignore $REP. Pourtant, si je copie-colle /home/chris/Images à partir de lxde-wallpaper.txt, ça marche très bien, il n'y a donc pas de problème dans la rédaction du répertoire.
Si je met un zenity --info --text $REP au dessus de done < <(find $REP/, il m'affiche bien /home/chris/Images/, preuve qu'il récupère la variable avec l'adresse du répertoire depuis le fichier des variables. Et pourtant cela ne marche pas.
Je sèche totalement. J'ai mis done < <(find $REP/ ou done < <(find "$REP/", cela ne change rien.
Si quelqu'un a une idée....
Dernière modification par Christophe C (Le 24/04/2012, à 10:21)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#2 Le 20/04/2012, à 10:50
- credenhill
Re : [résolu] passer des variables externes dans un script bash
hello
essaye avec
export DUREE=1m
export REP=/home/chris/Images
Hors ligne
#3 Le 20/04/2012, à 11:08
- Christophe C
Re : [résolu] passer des variables externes dans un script bash
Merci de ta réponse.
J'ai mis cela lxde-wallpaper.txt, mais cela ne change rien. find continue à taper sur tous les répertoires, et ignore toujours le rep /home/chris/Images/.
Comme précédemment indiqué, si je copie /home/chris/Images/ à la main depuis lxde-wallpaper.txt, ça marche, par contre. Il y a un problème à l'import, mais je ne comprend pas lequel, d'autant que zenity --info --text $REP dans le script me renvoie la bonne variable.
Bref, export ne change rien.
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#4 Le 20/04/2012, à 11:24
- pingouinux
Re : [résolu] passer des variables externes dans un script bash
Bonjour,
Si REP est défini dans
source /home/chris/Documents/Scripts/lxde-wallpaper/lxde-wallpaper-data.txt
quand on commence cette boucle
while read ligne
do
....................
done < <(find $REP/ | grep -iE "jpg|png|gif" | sort -R)
REP n'a pas encore été initialisé.
Hors ligne
#5 Le 20/04/2012, à 11:32
- Christophe C
Re : [résolu] passer des variables externes dans un script bash
Oui, la première passe de pcmanfm -w "$ligne" ne donne rien, puisque la liste n'a pas encore été générée. Cela ne marche qu'au second changement de papier peint. C'est un défaut du script, mais ce n'est qu'un problème mineur, à ce stade.
En effet, même au passage N°5, ça merde toujours.
Et comme indiqué, si je copie/colle l'adresse du répertoire, ça marche (à compter du second passage). C'est bien un problème d’import de la variable qui me bloque.
Dernière modification par Christophe C (Le 20/04/2012, à 11:33)
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#6 Le 20/04/2012, à 11:49
- Postmortem
Re : [résolu] passer des variables externes dans un script bash
Salut,
Il faut que tu source le fichier contenant les variables juste avant le while read ligne
Comme tu le fais actuellement, $REP n'est pas connu, peu importe à quel passage de la boucle tu es. $REP n'est évalué qu'une seule fois. Et donc ton find se fait sur / et non $REP/.
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne
#7 Le 20/04/2012, à 11:55
- pingouinux
Re : [résolu] passer des variables externes dans un script bash
la première passe de pcmanfm -w "$ligne" ne donne rien
Ce n'est pas normal. La liste <(find $REP... est générée avant de démarrer la boucle; ligne devrait contenir quelque chose dès la première itération.
Essaye ceci :
#!/bin/bash
while : #début boucle sans fin
do
source /home/chris/Documents/Scripts/lxde-wallpaper/lxde-wallpaper-data.txt
while read ligne
do
pcmanfm -w "$ligne" #change le papier peint.
sleep $DUREE
done < <(find $REP/ | grep -iE "jpg|png|gif" | sort -R)
done
Ajouté : Grillé par Postmortem pendant la rédaction de ma réponse, mais on est d'accord
Dernière modification par pingouinux (Le 20/04/2012, à 11:57)
Hors ligne
#8 Le 20/04/2012, à 12:21
- Christophe C
Re : [résolu] passer des variables externes dans un script bash
RAAAAAH ! Merci à pingouinux et Postmortem. C'est effectivement AVANT cette putain de boucle qu'il fallait mettre mon source. Et là, ça marche. Je n'avais pas compris que le done < <(find $REP n'était évalué qu'une fois (mais c'est logique, en fait, sinon, $ligne ne bougerait jamais).
Surtout, ce que je comprend, c'est que d'un point de vue séquentiel, le done < <(find $REP est généré avant le while read ligne (ce qui est également logique). C'est bien ça ?
BountySource - Faite un petit don, ponctuel ou récurent, pour soutenir le développement de XFCE.
Timeshift - Sécurité : pensez à paramétrer des points de restauration système.
Euclide : « Ce qui est affirmé sans preuve peut être nié sans preuve ».
Hors ligne
#9 Le 20/04/2012, à 13:55
- Postmortem
Re : [résolu] passer des variables externes dans un script bash
C'est plus exactement < <(find...) qui est évalué avant l'exécution de la boucle.
Les redirections sont faites avant l'exécution des commandes.
Un peu de lecture pour savoir comment bash traite les commandes :
man -P 'less -ip "^développement des commandes"' bash
# Ou si ton man est en anglais :
man -P 'less -ip "^simple command expansion"' bash
Dernière modification par Postmortem (Le 20/04/2012, à 13:56)
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne