Pages : 1
#1 Le 08/05/2008, à 23:31
- yurek
probleme zenity et les function !
Salut tout le monde je vais vous déranger par un probleme qui est embettant.
Lorsque j'execute :
#!/bin/bash
function apel {
BOO=3
}
BOO=1
apel
echo $BOO
BOO a bien la valeur 3
mais lorsque j'execute :
#!/bin/bash
function apel {
BOO=3
}
BOO=1
apel |zenity --progress
echo $BOO
BOO a la valeur 1
Donc ma question est comment faire en sorte que les variable soient conservé a travers les tubes dans zenity ?
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#2 Le 09/05/2008, à 00:11
- snapshot
Re : probleme zenity et les function !
héhé ! intéressante question
mais j'ai finalement trouvé la solution : la valeur 3 est perdue car bash lance la fonction dans un sous-shell (il fait un fork), au retour du sous-shell, sa mémoire est détruite, et la variable avec...
Pour t'en convaincre, utilise le code suivant :
#!/bin/bash
function apel {
echo "Niveau de shell=$BASH_SUBSHELL" >&2
BOO=3
}
BOO=1
apel |zenity --progress
echo $BOO
script à lancer avec et sans zenity. Et d'ailleurs, zenitu n'y est pour rien, car le phénomène se produit aussi avec d'autres commandes, comme "less" ou "gzip"
Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !
Hors ligne
#3 Le 09/05/2008, à 00:24
- yurek
Re : probleme zenity et les function !
OK merci pour l'explication, mais comment récupéré la variable (en C on utilise return0 mais la je sais pas !
Je comprend pas si je n'exécute pas zenity ca marche comme il faut, avec zenity je perd ma variable ...
Sinon je viens de comprendre que si un exit est exécute dans ce fork (avec zenity) le script continu ! COmment faire pour que le exit qui s'exécute dans le fork (avec zenity) se répercute dans le code initiale ?
Merci pour tes réponses.
Dernière modification par yurek (Le 09/05/2008, à 00:26)
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#4 Le 09/05/2008, à 07:57
- snapshot
Re : probleme zenity et les function !
A partir du moment ou tu mets une suite de pipe, chaque constituant est appelé dans un processus séparé et exécuté en parallèle. Pour les fonctions, c'est un piège car ça ressemble à une fonction alors qu'en fait, bash l'a transformé en une commande externe : c'est comme si tu avais fait 2 scripts. Donc ce qui se passe dans le 2ème script n'affecte en rien le 1er : tu peux faire autant de changement de variables ou de exit, ça ne touche pas à l'appelant.
Il faut peut-être que tu revois l'architecture de ton script...
Ou alors, il y a cette méthode, mais c'est lourd :
#!/bin/bash
# gestion d'un fichier temporaire, automatiquement détruit
trap 'if [ -f "$tmp" ] ; then rm -v $tmp; fi' EXIT
tmp=$(tempfile)
function apel {
echo BOO=3 > $tmp
}
BOO=1
apel | zenity --progress
source $tmp
echo $BOO
L'idée est que le sous-processus écrive un bout de script qui sera inclus (commande source) par le parent au moment du retour. Si le fils souhaite faire faire un exit au parent, il n'a qu'a mettre "exit" dans le fichier temporaire.
Mais c'est lourdingue....
Le trap en début du script s'assure que le fichier temporaire sera toujours détruit, quoi qu'il arrive (ctrl-c, ou autre)
Pensez à mettre [Résolu] dans le titre une fois votre problème réglé !
Hors ligne
#5 Le 09/05/2008, à 10:35
- yurek
Re : probleme zenity et les function !
merci pour l'explication, mille merci.
Je croix que je vais utiliser cette méthode, j'ai pas le choix...
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne
#6 Le 09/05/2008, à 11:40
- Laurent82
Re : probleme zenity et les function !
Selon les cas il y a moyen de se débrouiller avec Zenity
Par exemple :
#!/bin/bash
appel() {
n=$i
}
n=1
for i in {1..10}
do
sleep .2
echo $((i*10))
appel
done | zenity --progress --auto-close
echo $n
le "echo $n" de la fin donnera "1"
par contre en s'y prenant comme ça :
#!/bin/bash
appel() {
n=$i
}
n=1
exec 3> >(zenity --progress --auto-close)
for i in {1..10}
do
sleep .2
echo $((i*10)) >&3
appel
done
exec 3>&-
echo $n
le "echo $n" donnera "10"
#7 Le 11/05/2008, à 00:58
- yurek
Re : probleme zenity et les function !
interessant, faut que je regarde ce que c'est ce exec. Merci
http://doc.ubuntu-fr.org/installation/debutants
http://doc.ubuntu-fr.org/diagnostic
http://doc.ubuntu-fr.org/diagnostic_outils
http://doc.ubuntu-fr.org/reflexe_ubunteros
Hors ligne