Différence entre “a = b” et “export a = b” dans bash

50

Quelle est la différence entre:

a=b

et

export a=b

En bash?

Je comprends qu’ils définissent tous les deux des variables d’environnement, mais je ne comprends pas bien la différence.

Adam Matan
la source
Quelqu'un pourrait-il s'il vous plaît modifier cela? Ce n’est pas du tout lié à Linux, mais dépend uniquement du shell que vous utilisez. Je suppose que c'est bash ici, qui fonctionne aussi sous Windows.
InnaM
Je me suis trompé.
Adam Matan

Réponses:

54

export propage la variable aux sous-processus.

Par exemple, si vous avez fait

FOO=bar

puis un sous-processus qui a vérifié FOO ne trouverait pas la variable alors que

export FOO=bar

permettrait au sous-processus de le trouver.

Mais si FOOa déjà été défini en tant que variable d'environnement, alors FOO=barmodifiera la valeur de cette variable d'environnement.

Par exemple:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

Les coquilles plus anciennes ne supportaient pas la export FOO=barsyntaxe; tu devais écrire FOO=bar; export FOO.

Mike McQuaid
la source
33
En fait, si vous n'utilisez pas " export", vous ne définissez pas une variable d'environnement, mais simplement une variable shell. Les variables shell ne sont disponibles que pour le processus shell; Les variables d'environnement sont disponibles pour tout processus ultérieur, pas seulement pour les shells. En outre, les sous-shell sont des commandes contenues entre parenthèses, qui ont accès aux variables de shell, alors que vous parlez de processus enfants qui se trouvent être des shells.
wfaulk
Où sont-ils stockés?
HDave
28

Si vous n'utilisez pas export, vous ne définissez pas de variable d'environnement; juste une variable shell.

Les variables shell ne sont disponibles que pour le processus shell; Les variables d'environnement sont disponibles pour tout processus ultérieur, pas seulement pour les shells.

wfaulk
la source
2

En outre, si vous souhaitez que la variable soit disponible pour le shell appelant sans utiliser l'exportation, vous pouvez procéder comme suit:

Le fichier a.ksh est -

#!/bin/ksh
FOO=bar

À l'invite, exécutez ceci

> . a.ksh

Cela exécutera les commandes dans le même shell et $ FOO sera disponible.

Tandis que,

> a.ksh

Rendra $ FOO disponible uniquement dans a.ksh, après l'appel à a.ksh, il n'existerait pas.

Alok
la source
1
Correct. Notez que "." est juste un raccourci pour "source", qui est parfois utilisé dans les scripts pour une meilleure lisibilité. Voir "aide". ou "source d'aide" pour plus de détails.
Sleske
1

En plus de ce qui a déjà été répondu, ces deux instructions ne définissent pas nécessairement (c.-à-d. Create vs set) une variable d'environnement comme "a" peut déjà exister en tant que variable d'environnement ou de shell.

Dans ce dernier cas, les deux déclarations sont strictement équivalentes.

jlliagre
la source