[bash] variables dans fonction arrière plan

Résolu/Fermé
gogy Messages postés 5 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 5 juin 2011 - 3 juin 2011 à 21:58
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 5 juin 2011 à 09:11
Bonjour à tous.
J'ai un souci avec la gestion des variables dans des fonctions lancées en arrière plan.
Il me semblait que les variables utilisées dans une fonction étaient globales, or je n'arrive pas à les récupérer.
Voici l'exemple :
#!/bin/bash

duNEW()
{
	dunew1=$(du -ks /home/moi/) &&
	new1=1
echo $dunew1
echo $new1
}

duOLD()
{
	duold1=$(du -ks /media/HDD/0-Backup/rsync/home/moi/) &&
	old1=1
echo $duold1
echo $old1
}

duNEW &
duOLD &
wait

echo "OK"
echo $dunew1
echo $new1
echo $duold1
echo $old1
read


J'obtiens un résultat sur les echo à l'intérieur des fonctions mais après le OK, que du vide !
Je ne comprends pas pourquoi ces variables n'existent plus ?

Nota : lorsque l'appel des 2 fonctions se fait en synchrone (sans le &), j'obtiens bien mes variables.

Merci d'avance de votre aide précieuse !


A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
4 juin 2011 à 11:02
Salut,

Extrait de man bash :
Si une commande se termine par l'opérateur de contrôle &, l'interpréteur l'exécute en arrière-plan, dans un sous-shell. 



Extrait de "Guide avancé d'écriture des scripts Bash" :
Un script peut ne pas faire un export de ses variables à son processus parent, le shell ou à l'environnement. Comme nous l'avons appris en biologie, un processus fils peut hériter de son parent, mais le contraire n'est pas vrai. 


A part coller tes variables dans un fichier et sourcer celui-ci par la suite, je ne vois pas trop comment faire ;-\

;-((
1
gogy Messages postés 5 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 5 juin 2011 2
4 juin 2011 à 15:07
Salut zipe31

Merci de ta réponse, je suis passé par l'écriture dans un fichier ne voyant pas d'autre solution (on a eu la même idée :) en plus, ça me sert de fichier de log donc c'est au poil.
Cependant la fonction export fonctionne, je l'ai testé. Peut-être pas dans tous les cas...
Merci encore !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
4 juin 2011 à 15:09
Re-

Non la fonction export ne marche pas si la fonction est lancée en arrière-plan ;-(
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
4 juin 2011 à 15:16
De plus dans une fonction, les variables sont globales nativement (enfin pour le shell appelant), il faut les déclarer avec l'option "typeset" pour qu'elles ne soient pas exportées...
0
gogy Messages postés 5 Date d'inscription lundi 2 avril 2007 Statut Membre Dernière intervention 5 juin 2011 2
5 juin 2011 à 00:29
#!/bin/bash

fonction()
{
 export variable="ceci est ma variable modifiee"
}

variable="c'est est ma variable"

echo $variable
fonction
echo $variable


Ceci fonctionne !
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 408
5 juin 2011 à 09:11
Salut,

Bon je vais re-expliquer ici ce que je t'ai dit ailleurs...

Les variables d'une fonction sont globales par défaut, il faut les déclarer implicitement avec l'option "typeset" pour qu'elles aient une portée locale et non globale.

De plus, si la fonction est lancée en arrière-plan, elle est lancée dans un sous-shell et comme l'a si bien dit N_Bah*, elles ne peuvent en aucun cas être rattachées au shell parent.

La preuve :

$ cat brol.sh
#!/bin/bash
fonction()
{
variable="ceci est ma variable modifiee"
}

fonction_bis()
{
variable2="ceci est ma variable2 modifiee"
}

variable="c'est ma variable"

echo Avant la fonction : $variable
fonction
echo Après la fonction : $variable
fonction&

variable2="c'est ma variable2"

echo Avant la fonction_bis : $variable2
fonction_bis&
echo Après la fonction_bis : $variable2

$ ./brol.sh
Avant la fonction : c'est ma variable
Après la fonction : ceci est ma variable modifiee
Avant la fonction_bis : c'est ma variable2
Après la fonction_bis : c'est ma variable2

* Membre sur un autre forum
0