Qu'est - export
?
Quelle est la différence entre:
export name=value
et
name=value
Qu'est - export
?
Quelle est la différence entre:
export name=value
et
name=value
export
rend la variable à la disposition des sous-processus.
Qui est,
export name=value
signifie que le nom de la variable est disponible à tout processus que vous exécutez à partir de ce processus de shell. Si vous voulez un processus visant à rendre l'utilisation de cette variable, utilisez export
, et de lancer le processus de shell.
name=value
signifie que la variable champ d'application est limité à la coque, et n'est pas disponible pour tout autre processus. Vous pouvez utiliser cette pour (dire) de la boucle de variables, les variables temporaires etc.
Il est important de noter que l'exportation d'une variable n'est pas disponible pour les parents des processus. C'est, de spécification et de l'exportation d'une variable dans un processus engendré n'est pas disponible dans le processus qui l'a lancé.
Il a été dit qu'il n'est pas nécessaire de les exporter en bash quand la ponte sous-coquille, tandis que d'autres ont dit exactement le contraire. Il est important de noter la différence entre les sous-coquille (ceux qui sont créés par (), `, $() ou boucles) et les sous-processus (processus qui sont appelés par leur nom, par exemple un littéral 'bash' apparaissant dans votre script). Sous-coquille permettra d' avoir accès à toutes les variables de la mère, indépendamment de leur exportés en l'état. Les sous-processus sur l'autre main va seulement voir les variables exportées. Ce qui est commun à ces deux constructions est que ni peut passer des variables à la maison mère de shell.
$ noexport=noexport; export export=export; (echo subshell: $noexport $export; subshell=subshell); bash -c 'echo subprocess: $noexport $export; subprocess=subprocess'; echo parent: $subshell $subprocess
subshell: noexport export
subprocess: export
parent:
Il est encore une source de confusion: certains pensent que 'fourche' sous-processus sont ceux qui ne voient pas non exportée variables. Généralement fork()s sont immédiatement suivis par exec()s, et c'est pourquoi il semblerait que le fork() est la chose à trouver, alors qu'en fait c'est le exec(). Vous pouvez exécuter des commandes sans fork()ing d'abord avec l' exec
de commande, et le processus a commencé par cette méthode sera également n'ont pas accès à désexporter variables:
$ noexport=noexport; export export=export; exec bash -c 'echo execd process: $noexport $export; execd=execd'; echo parent: $execd
execd process: export
Notez que nous ne voyons pas l' parent:
ligne cette fois, parce que nous avons remplacé le parent shell avec l' exec
de commande, donc il n'y a rien pour l'exécution de cette commande.
D'autres ont répondu que l'exportation rend la variable disponibles à la sous-coquille, et que c'est correct, mais simplement un effet secondaire. Lorsque vous exportez une variable, il met cette variable dans l'environnement du shell courant (c'est à dire le shell appels putenv(3) ou setenv(3)). L'environnement d'un processus est héritée à travers exec, faisant de la variable visible dans les sous-coquille.
export NAME=value
pour les paramètres et les variables qui ont un sens pour un sous-processus.
NAME=value
de travail temporaire ou les variables de boucle privé dans le shell en cours de processus.
Plus en détail, export
marques le nom de la variable dans l'environnement que les copies d'un sous-processus et de leurs sous-processus lors de la création. Pas de nom ou de valeur est jamais copiés à partir de la sous-processus.
Une erreur courante consiste à placer un espace autour du signe égal:
$ export FOO = "bar"
bash: export: `=': not a valid identifier
Seul le exporté variable (B
) est vu par le processus secondaire:
$ A="Alice"; export B="Bob"; echo "echo A is \$A. B is \$B" | bash
A is . B is Bob
Les changements dans le processus secondaire de ne pas modifier le shell principal:
$ export B="Bob"; echo 'B="Banana"' | bash; echo $B
Bob
Les Variables marquées à l'exportation ont des valeurs copiées lorsque le sous-processus est créé:
$ export B="Bob"; echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash &
[1] 3306
$ B="Banana"; echo '(sleep 30; echo "Subprocess 2 has B=$B")' | bash
Subprocess 1 has B=Bob
Subprocess 2 has B=Banana
[1]+ Done echo '(sleep 30; echo "Subprocess 1 has B=$B")' | bash
N'a exporté que des variables deviennent partie intégrante de l'environnement (man environ
):
$ ALICE="Alice"; export BOB="Bob"; env | grep "ALICE\|BOB"
BOB=Bob
Donc, maintenant, il devrait être clair comme l'été, du soleil! Grâce à Cerveau Agnew, alexp, et William Prusell.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.