Définition des variables d'environnement Linux

9

J'utilise Red Hat Linux Enterprise 5; J'utilise toujours la commande export pour définir les variables d'environnement.

Existe-t-il d'autres moyens de définir des variables d'environnement et quels sont leurs avantages / inconvénients?

George2
la source

Réponses:

15

Voici un extrait de la page de manuel Bash:

export [-fn] [nom [= mot]] ...
export -p
Les noms fournis sont marqués pour l'exportation automatique vers l'environnement des commandes exécutées ultérieurement. Si l'option -f est                 étant donné, les noms font référence à des fonctions ...

Si vous n'avez besoin que de la variable dans l'environnement actuel, il n'est pas nécessaire d'utiliser export.

var=value

Modifier:

Sans exportation: environnement actuel uniquement. Avec exportation: environnement actuel et environnements enfants.

Voici une démonstration de l'impact de l'exportation sur la disponibilité d'une variable dans un environnement enfant et du fait que les modifications apportées à l'environnement enfant n'affectent pas le parent:

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

Après le premier écho ( echo "parent..." ) vous voyez "123" et "456" parce que les deux var1 et var2 sont actifs dans l'environnement actuel. Vous ne voyez pas de valeur pour var3 parce que ce n'est pas encore défini.

Après la ligne qui commence " var3=... "vous ne voyez pas de valeur pour var1 parce qu'il n'a pas été exporté. Vous faire voir une valeur pour var2 parce qu'il était exportés. Vous voyez une valeur pour var3 parce qu'il a été défini pour l'environnement des enfants seulement .

( bash -c équivaut à exécuter un script avec le contenu de l'argument de la -c option. Un script ou un autre exécutable ou, dans ce cas, l’argument à bash -c devient un enfant de l’environnement actuel, qui est bien entendu le parent de l’enfant.)

Dans le "script", les valeurs de la variable sont modifiées. Il affiche maintenant ces nouvelles valeurs.

Une fois le "script" terminé, l'exécution revient à l'environnement parent (la ligne de commande dans ce cas). Après le dernier écho, vous voyez les valeurs d'origine car les modifications apportées à l'environnement enfant n'affectent pas le parent.

Dennis Williamson
la source
Que signifie "dans l'environnement actuel"? Le script bash actuel ou?
George2
1
Oui, cela signifie "dans le script actuel" ou "dans la session interactive en cours". Cela exclut donc les exécutables ou les scripts exécutés à partir du script ou de la session interactive en cours. C'est le but de export - rendre les variables disponibles pour ces environnements enfants.
Dennis Williamson
Je trouve des conflits de ce que vous avez dit. :-) Vous avez dit "Cela exclut les exécutables ou les scripts", faites attention à "exclure", mais dans ce que vous avez cité, vous avez mentionné "Les noms fournis sont marqués pour l'exportation automatique dans l'environnement des commandes exécutées par la suite". - il doit être "inclus" (exporté automatiquement vers, ou impact), et non "exclure". Je suis confus, pourriez-vous clarifier s'il vous plaît?
George2
1
@ George2: Voir ma réponse modifiée pour plus d'informations.
Dennis Williamson
3

Vous dites que

J'utilise toujours la commande export pour définir la variable d'environnement

Au dire de vos propos, on dirait que vous essayez vraiment de vous demander comment vous faites persister une variable environnementale. Pour ce faire, vous devrez placer votre export VAR="foo" dans votre fichier $ HOME / .bash_profile (si vous utilisez bash). Si vous voulez que cette variable d'environnement persiste pour tous les utilisateurs sauf root, ajoutez-la à / etc / profile. Si vous souhaitez également l'ajouter à l'utilisateur root, définissez-le dans /root/.bash_profile.

Cela fonctionnera pour tous les shell de connexion où bash est le shell de choix. Pour les shells non connectés, vous devez utiliser .bashrc. Je n'ai aucune idée à offrir pour les autres coquilles: D

whaley
la source
2
Vous voudrez peut-être relire la section de la page de manuel Bash concernant la provenance de ces fichiers.
Dennis Williamson
1
Yup ... Je me suis connecté et interactif confus. Modification de ma réponse pour réfléchir. Merci pour la correction!
whaley
"faire persister une variable environnementale" - quels moyens persiste?
George2
1
"Persister" signifie que vous voulez que cette variable ait cette valeur à chaque démarrage d'un shell. Il peut être nécessaire ou non d'exporter la variable en fonction de son objectif.
Dennis Williamson
1
Cela signifie que vous ne l'avez pas rendu persistant. Essayez de faire quoi Whaley décrit.
Dennis Williamson
1

l'exportation est le moyen le plus simple de le faire, alors pourquoi ne pas en rester là?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells
BloodPhilia
la source
2
Bourne Shell requiert VARIABLE = valeur; exportation VARIABLE
mpez0
1
Cela devrait fonctionner aussi ...
BloodPhilia
@BloodPhilia, pour bash, un seul moyen de définir une variable d'environnement?
George2
1
@ George2 - Lorsque vous utilisez VARIABLE = valeur, vous créez une variable locale qui disparaît après l'exécution du script en cours. Lors de l'utilisation de l'exportation, les processus enfants héritent des valeurs de variable de leur processus parent. Par exemple: FOO=BAR; executethisprogram Le programme executethisprogram NE SAURAIT PAS la valeur de la variable FOO. Par contre, en utilisant: FOO=BAR; export FOO; executethisprogram Le programme executethisprogram Connaître la valeur de la variable FOO.
BloodPhilia
1
exécuter ce programme est ne pas un sous-processus de "export FOO". C'est un sous-processus (enfant) du script qui l'appelle ou le shell interactif (ligne de commande). export FOO est une commande qui marque la variable FOO afin qu'il soit accessible aux processus enfants de l'environnement dans lequel la commande a été émise. Ce parent peut être un script ou un shell interactif.
Dennis Williamson
1

Vous pouvez aussi faire quelque chose comme ça:

VAR=val application

Par exemple:

LANG=C ls --help

sortie en anglais.

LANG=pl_PL ls --help

sortie en polonais (si disponible).

Dans le passé, sh ne pouvait pas exporter VAL = val. Tu devais

VAL=val; export VAL
gogiel
la source
Je suis confus au sujet de "application VAR = val", de quoi signifie val et de quoi signifie application?
George2
2
Ces exemples définissent la valeur de la variable pour l'environnement enfant ( ls, par exemple) sans affecter la valeur de cette variable dans l’environnement actuel (parent).
Dennis Williamson
ls est l'environnement enfant de quoi? Je suis confus.
George2
1
ls est un enfant du processus à partir duquel il a été exécuté. Si je tape ls à une invite de commande, le shell interactif est le parent et ls est l'enfant. Si j'ai un script qui utilise ls alors le script est le parent et ls est l'enfant.
Dennis Williamson