Le 25/01/16 à 18:11, Daniel Caillibaud <m...@lairdutemps.org> a écrit : DC> Faudrait que j'essaie en exportant une fct d'écriture (dans mon fichier $RAPPORT) depuis le DC> script principal vers le sous-shell…
ça change rien DC> Sinon, y'a peut-être une autre solution en utilisant par un descripteur de fichier en DC> lecture (écrire dedans plutôt que dans $RAPPORT) ou alors en utilisant un signal pour DC> signifier au shell parent que l'on a écrit qqchose dans $RAPPORT, mais il faudrait alors DC> fermer le descripteur qui capture sdtout pour lire le contenu, on tourne en rond (et ça DC> devient une usine à gaz). DC> DC> Moralité, la solution que tu mentionnes est probablement la plus simple, quitte à faire DC> des fcts main1, main2… Sauf que si je veux séparer stdout et stdErr vers des pipes différents je sais pas faire sans sous-shell. Et le sous-shell qui se ferme ne suffit pas à garantir que le contenu du fichier est vu correctement par le shell parent, faut aussi "attendre un peu". Exemple, un fichier test.sh #!/bin/bash LOGERR=err LOGSTD=out >$LOGERR >$LOGSTD myPid=$$ errors=no function fin() { [ -s $LOGSTD ] && echo plein || echo vide [ $(wc -l < $LOGSTD) -gt 0 ] && echo plein || echo vide [ "$errors" == "yes" ] && echo "erreurs détectées" || echo "pas d'erreur détectée" } trap "errors=yes" RTMIN trap fin EXIT exec > >(while read line; do echo "[$(date '+%F %T')] $line" >> $LOGSTD; done) exec 2> >(kill -RTMIN $myPid; while read line; do echo "[$(date '+%F %T')] ERROR : $line"|tee -a $LOGERR >> $LOGSTD; done) echo erreur >&2 fin echo "sortie" en le lançant et regardant le fichier juste après, ça donne : ./test.sh; cat out; sleep 0.2; echo; cat out [2016-01-26 19:26:24] vide [2016-01-26 19:26:24] ERROR : erreur [2016-01-26 19:26:24] vide [2016-01-26 19:26:24] vide [2016-01-26 19:26:24] ERROR : erreur [2016-01-26 19:26:24] vide [2016-01-26 19:26:24] erreurs détectées [2016-01-26 19:26:24] sortie [2016-01-26 19:26:24] plein [2016-01-26 19:26:24] plein [2016-01-26 19:26:24] erreurs détectées Mais si je met le kill après l'écriture dans le sous-shell avec exec 2> >(while read line; do echo "[$(date '+%F %T')] ERROR : $line"|tee -a $LOGERR >> $LOGSTD; done; kill -RTMIN $myPid;) ça donne ./test.sh: ligne 22 : kill: (23702) - Aucun processus de ce type [2016-01-26 19:30:46] vide [2016-01-26 19:30:46] ERROR : erreur [2016-01-26 19:30:46] vide [2016-01-26 19:30:46] vide [2016-01-26 19:30:46] ERROR : erreur [2016-01-26 19:30:46] vide [2016-01-26 19:30:46] pas d'erreur détectée [2016-01-26 19:30:46] sortie [2016-01-26 19:30:46] plein [2016-01-26 19:30:46] plein [2016-01-26 19:30:46] pas d'erreur détectée bizarre non ? Le processus principal est déjà fini (plus de pid) alors que le kill du sous-shell n'a pas terminé… Je vais arrêter là et garder mon sleep… -- Daniel Bien sûr l'Amérique avait été découverte avant Colomb. Mais le secret avait été bien gardé. Oscar Wilde