J'ai la fonction récursive suivante pour définir les variables d'environnement:
function par_set {
PAR=$1
VAL=$2
if [ "" != "$1" ]
then
export ${PAR}=${VAL}
echo ${PAR}=${VAL}
shift
shift
par_set $*
fi
}
Si je l'appelle par lui-même, il définit à la fois la variable et fait écho à stdout:
$ par_set FN WORKS
FN=WORKS
$ echo "FN = "$FN
FN = WORKS
La redirection de stdout vers un fichier fonctionne également:
$ par_set REDIR WORKS > out
cat out
REDIR=WORKS
$ echo "REDIR = "$REDIR
REDIR = WORKS
Mais, si je redirige stdout vers une autre commande, la variable n'est pas définie:
$ par_set PIPE FAILS |sed -e's/FAILS/BARFS/'
PIPE=BARFS
$ echo "PIPE = "$PIPE
PIPE =
Pourquoi le canal empêche-t-il la fonction d'exporter la variable? Existe-t-il un moyen de résoudre ce problème sans recourir à des fichiers temporaires ou à des canaux nommés?
Résolu:
Code de travail grâce à Gilles:
par_set $(echo $*|tr '=' ' ') > >(sed -e's/^/ /' >> ${LOG})
Cela permet au script d'être appelé ainsi:
$ . ./script.sh PROCESS_SUB ROCKS PIPELINES=NOGOOD
$ echo $PROCESS_SUB
ROCKS
$ echo $PIPELINES
NOGOOD
$ cat log
7:20140606155622162731431:script.sh:29581:Parse Command Line parameters. Params must be in matched pairs separated by one or more '=' or ' '.
PROCESS_SUB=ROCKS
PIPELINES=NOGOOD
Projet hébergé sur bitbucket https://bitbucket.org/adalby/monitor-bash si intéressé par le code complet.