Je ne pense pas que cela puisse fonctionner en l'état :
- le "&&" qui sépare la commande de l'affectation de la variable CODEx fait que cette affectation ne sera effectuée que si la commande sort sans erreur. Donc, soit CODEx vaut 0, soit elle n'existe pas du tout. On pourrait remplacer && par un simple ; (point virgule), mais ...
- lorsque des commande sont exécutées en arrière plan, il y a un fork du shell. Tout ce qui est entre accolades est donc exécuté par un sous shell, et aucune des variables affectées dans ce sous-shell n'est récupérable par le shell appelant. Après le wait, les variables CODEx n'existent donc pas (sauf si elles avaient été déclarées avant, mais alors leur valeur ne serait pas modifiée).
La réponse au problème semble effectivement plus complexe que prévue.
Quelques pistes à explorer :
- wait sans argument attend que tous les processus fils soient terminés (et renvoie certainement le code retour du dernier qui se finit)
- on peut récupérer le PID d'un process lancé en arrière plan dans la variable $!
- wait nnn attend la fin du process ayant le pid nnn (mais je ne vois pas bien comment utiliser wait ici, pour attendre la fin de plusieurs processus successivement alors que l'on ne connaît pas l'ordre dans lequel ils vont finir)
Une solution simple (même si elle n'est pas très élégante) pourrait être de rajouter, à la fin des commandex quelque chose du genre "echo $? > /tmp/$$", de récupérer dans une variable le pid des commande en background ($!) et de relire les fichiers concernés après le wait.
En plus clair :
[^] # ... malheureusement
Posté par JJD . En réponse au message Execution background et code de sortie. Évalué à 2.
Je ne pense pas que cela puisse fonctionner en l'état :
- le "&&" qui sépare la commande de l'affectation de la variable CODEx fait que cette affectation ne sera effectuée que si la commande sort sans erreur. Donc, soit CODEx vaut 0, soit elle n'existe pas du tout. On pourrait remplacer && par un simple ; (point virgule), mais ...
- lorsque des commande sont exécutées en arrière plan, il y a un fork du shell. Tout ce qui est entre accolades est donc exécuté par un sous shell, et aucune des variables affectées dans ce sous-shell n'est récupérable par le shell appelant. Après le wait, les variables CODEx n'existent donc pas (sauf si elles avaient été déclarées avant, mais alors leur valeur ne serait pas modifiée).
La réponse au problème semble effectivement plus complexe que prévue.
Quelques pistes à explorer :
- wait sans argument attend que tous les processus fils soient terminés (et renvoie certainement le code retour du dernier qui se finit)
- on peut récupérer le PID d'un process lancé en arrière plan dans la variable $!
- wait nnn attend la fin du process ayant le pid nnn (mais je ne vois pas bien comment utiliser wait ici, pour attendre la fin de plusieurs processus successivement alors que l'on ne connaît pas l'ordre dans lequel ils vont finir)
Une solution simple (même si elle n'est pas très élégante) pourrait être de rajouter, à la fin des commandex quelque chose du genre "echo $? > /tmp/$$", de récupérer dans une variable le pid des commande en background ($!) et de relire les fichiers concernés après le wait.
En plus clair :
{ commande1 "$var1" > fichier1 ; echo $? >/tmp/res.$$ ; } &
pid1=$!
{ commande2 "$var2" > fichier2 ; echo $? >/tmp/res.$$ ; } &
pid2=$!
{ commande3 "$var3" > fichier3 ; echo $? >/tmp/res.$$ ; } &
pid3=$!
wait
retour1=`cat /tmp/res.$pid1`
rm /tmp/res.$pid1
retour2=`cat /tmp/res.$pid2`
rm /tmp/res.$pid2
retour3=`cat /tmp/res.$pid3`
rm /tmp/res.$pid3