1249 votes

La définition d'une variable avec ou sans exportation

Qu'est - export ?

Quelle est la différence entre:

export name=value

et

name=value

1363voto

Brian Agnew Points 143181

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é.

343voto

alxp Points 3180

Pour illustrer ce que les autres réponses sont en disant:

al$ foo="Hello, World"
al$ echo $foo
Hello, World
al$ bar="Goodbye"
al$ export foo
al$ bash
bash-3.2$ echo $foo
Hello, World
bash-3.2$ echo $bar

bash-3.2$

98voto

Matyas Koszik Points 126

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.

87voto

William Pursell Points 56211

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.

39voto

Charles Merriam Points 4498

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.com

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.

Powered by:

X