Contenu | Rechercher | Menus

Annonce

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 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

Christophe C #5 a écrit :

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