[bash] variables dans fonction arrière plan
Résolu
gogy
Messages postés
5
Statut
Membre
-
zipe31 Messages postés 38797 Statut Contributeur -
zipe31 Messages postés 38797 Statut Contributeur -
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 :
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 !
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:
- [bash] variables dans fonction arrière plan
- Youtube en arrière plan - Guide
- Arrière plan - Guide
- Fonction si et - Guide
- Arriere plan pc - Guide
- Arrière-plan messenger vidéo - Guide
2 réponses
Salut,
Extrait de man bash :
Extrait de "Guide avancé d'écriture des scripts Bash" :
A part coller tes variables dans un fichier et sourcer celui-ci par la suite, je ne vois pas trop comment faire ;-\
;-((
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 ;-\
;-((
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 !
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 !
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 :
* Membre sur un autre forum
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