Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/06/2011, 14h44   #1
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 4
Points : 4
Par défaut [bash] variables dans fonction lancée en background

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 :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/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 !
gogy13 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/06/2011, 15h17   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

Citation:
Envoyé par 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-interpréteur.
les variables créées, et assignées dans un sous-shell, n'existent pas et ne sont pas modifiées dans le shell courant.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 03/06/2011, 15h30   #3
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 4
Points : 4
Merci de ton aide N_BaH.
Comment récupérer mes valeurs alors ?
gogy13 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/06/2011, 10h28   #4
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
#!/bin/bash
fonction()
{
 export variable="ceci est ma variable modifiee"
}
 
variable="c'est est ma variable"
 
echo $variable
fonction
echo $variable
becket est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 04/06/2011, 14h56   #5
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 4
Points : 4
Merci beaucoup Becket !
Ça fonctionne.
J'ai utilisé une autre solution qui consiste à écrire le résultat de mes variables dans un fichier texte pour manipuler plus facilement les chaines de caractères et en même temps, ça me permet d'avoir un fichier de log.

Merci encore !
gogy13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/06/2011, 15h30   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par becket Voir le message
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
#!/bin/bash
fonction()
{
 export variable="ceci est ma variable modifiee"
}
 
variable="c'est est ma variable"
 
echo $variable
fonction
echo $variable
Salut,

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 :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
$ 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
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 00h33   #7
Invité de passage
 
Homme
Inscription : juin 2011
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 9
Points : 4
Points : 4
Ok je crois que j'ai saisi ! (on s'échange sur 2 forum en simultané
Comme dit plus haut, passer par un fichier reste la meilleure solution dans ce cas précis, tu confirmes ?
gogy13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2011, 09h14   #8
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Citation:
Envoyé par gogy13 Voir le message
Comme dit plus haut, passer par un fichier reste la meilleure solution dans ce cas précis, tu confirmes ?
A défaut de confirmer à 100%, disons que c'est la seule solution que j'envisage pour ma part.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h33.


 
 
 
 
Partenaires

Hébergement Web