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

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