[bash] variables dans fonction arrière plan
Résolu
gogy
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 36402 Date d'inscription Statut Contributeur Dernière intervention -
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
- Arrière plan - Guide
- Youtube en 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