Le problème, revisité
Franchement, le manuel est déroutant sur ce point. Le manuel GNU Bash dit:
L'environnement de toute commande ou fonction simple [notez que cela exclut les fonctions internes] peut être temporairement augmenté en le préfixant avec des affectations de paramètres, comme décrit dans Paramètres du shell. Ces instructions d'affectation n'affectent que l'environnement vu par cette commande.
Si vous analysez vraiment la phrase, ce qu'elle dit, c'est que l' environnement de la commande / fonction est modifié, mais pas l'environnement du processus parent. Donc, cela fonctionnera:
$ TESTVAR=bbb env | fgrep TESTVAR
TESTVAR=bbb
car l'environnement de la commande env a été modifié avant son exécution. Cependant, cela ne fonctionnera pas:
$ set -x; TESTVAR=bbb echo aaa $TESTVAR ccc
+ TESTVAR=bbb
+ echo aaa ccc
aaa ccc
à cause du moment où l'expansion des paramètres est effectuée par le shell.
Étapes de l'interprète
Une autre partie du problème est que Bash définit ces étapes pour son interpréteur:
- Lit son entrée à partir d'un fichier (voir Scripts Shell), d'une chaîne fournie comme argument à l'option d'invocation -c (voir Invocation de Bash) ou depuis le terminal de l'utilisateur.
- Décompose l'entrée en mots et opérateurs, en respectant les règles de citation décrites dans Quoting. Ces jetons sont séparés par des métacaractères. L'expansion des alias est effectuée par cette étape (voir Alias).
- Analyse les jetons en commandes simples et composées (voir Commandes Shell).
- Exécute les différentes extensions du shell (voir Expansions du shell), divisant les jetons développés en listes de noms de fichiers (voir Extension de nom de fichier) et commandes et arguments.
- Effectue toutes les redirections nécessaires (voir Redirections) et supprime les opérateurs de redirection et leurs opérandes de la liste d'arguments.
- Exécute la commande (voir Exécution de commandes).
- Attend éventuellement la fin de la commande et récupère son statut de sortie (voir Statut de sortie).
Ce qui se passe ici, c'est que les fonctions intégrées n'ont pas leur propre environnement d'exécution, donc elles ne voient jamais l'environnement modifié. En outre, les commandes simples (par exemple / bin / echo) n'obtenir un ennvironment modifié ( ce qui explique pourquoi l'exemple env a travaillé) mais l'expansion de la coquille se déroule dans le courant environnement à l' étape 4.
En d'autres termes, vous ne passez pas 'aaa $ TESTVAR ccc' à / bin / echo; vous passez la chaîne interpolée (telle que développée dans l'environnement actuel) à / bin / echo. Dans ce cas, puisque l'environnement actuel n'a pas de TESTVAR , vous passez simplement «aaa ccc» à la commande.
Résumé
La documentation pourrait être beaucoup plus claire. Heureusement qu'il y a Stack Overflow!
Voir également
http://www.gnu.org/software/bash/manual/bashref.html#Command-Execution-Environment