Que fait la commande 'export'?


85

Je suis un peu nouveau sur Linux, et il se trouve que j'exécute certaines commandes à l'aveugle, afin de faire avancer les choses. Je pensais que ce ne serait pas un gaspillage de poser ce type de questions, car davantage de nouvelles personnes auraient une connaissance régulière de celles-ci.

J'ai commencé à travailler avec Jenkins récemment, puis j'ai dû utiliser cette exportcommande pour exécuter l' archive de guerre Jenkins . J'avais donc besoin de savoir ce que fait la exportcommande en général, et pourquoi nous devons exécuter cette commande, tout en exécutant Jenkins (après la définition de la maison Jenkins).

Merci!


1
Cela vous aiderait si vous en disiez plus sur la commande d'exportation que vous avez utilisée. Sans plus de contexte, je suppose que vous définissez une variable d'environnement. Voir en.wikipedia.org/wiki/Environment_variable#Unix
Joshua D. Boyd


Réponses:


99

exportin shet les shells associés (tels que bash), marque une variable d'environnement à exporter vers les processus enfants, afin que l'enfant en hérite.

exportest défini dans POSIX :

Le shell attribuera l'attribut d'exportation aux variables correspondant aux noms spécifiés, ce qui les amènera à se trouver dans l'environnement des commandes exécutées ultérieurement. Si le nom d'une variable est suivi de = mot, alors la valeur de cette variable doit être mise à mot.


Merci beaucoup! Toutes vos réponses ont été très utiles et elles vous aident à apprendre encore quelques choses! :-)
Chathura Kulasinghe

1
Qu'est-ce qu'un processus enfant dans ce sens?
Zinan Xing

13
Je ne comprends pas
Martin Hansen

@MartinHansen que ne comprenez-vous pas? aussi, voyez ma réponse.
barlop

Il y a un crochet supplémentaire à la fin du lien, je ne peux pas le modifier, car il s'agit d'une modification à un seul symbole :)
Radoslav Stoyanov

27

Je suppose que vous venez d'un arrière-plan Windows. Je vais donc les comparer (je suis un peu nouveau sur Linux aussi). J'ai trouvé que la réponse de l'utilisateur à mon commentaire était utile pour comprendre les choses.

Sous Windows, une variable peut être permanente ou non. Le terme variable d'environnement comprend une variable définie dans le shell cmd avec la commande SET, ainsi que lorsque la variable est définie dans l'interface graphique Windows, ainsi définie dans le registre, et devient visible dans de nouvelles fenêtres cmd. par exemple, la documentation de la commande set dans Windows https://technet.microsoft.com/en-us/library/bb490998.aspx "Affiche, définit ou supprime les variables d'environnement. Utilisé sans paramètres, set affiche les paramètres d'environnement actuels." Sous Linux, set n'affiche pas les variables d'environnement, il affiche des variables shell qu'il n'appelle pas / ne fait pas référence en tant que variables d'environnement. De plus, Linux n'utilise pas set pour définir des variables (à l'exception des paramètres de position et des options de shell, que j'explique comme une note à la fin), uniquement pour les afficher et même alors uniquement pour afficher les variables du shell. Windows utilise set pour définir et afficher par exemple set a = 5, ce n'est pas le cas pour Linux.

Sous Linux, je suppose que vous pouvez créer un script qui définit des variables au démarrage, par exemple /etc/profileou /etc/.bashrcsinon, elles ne sont pas permanentes. Ils sont stockés dans la RAM.

Il existe une distinction sous Linux entre les variables shell et les variables d'environnement. Sous Linux, les variables shell se trouvent uniquement dans le shell actuel, et les variables d'environnement sont dans ce shell et tous les shells enfants.

Vous pouvez afficher les variables shell avec la setcommande (mais notez que contrairement à Windows, les variables ne sont pas définies sous Linux avec la commande set).

set -o posix; set (faire ce set -o posix une fois en premier, permet de ne pas afficher trop de choses inutiles). setAffiche donc les variables du shell.

Vous pouvez afficher les variables d'environnement avec la envcommande

les variables shell sont définies avec par exemple juste a = 5

les variables d'environnement sont définies avec l'exportation, l'exportation définit également la variable shell

Ici, vous voyez la variable shell zzz définie avec zzz = 5, et vous voyez qu'elle apparaît lors de l'exécution setmais ne s'affiche pas comme une variable d'environnement.

Ici, nous voyons yyy défini avec export, donc c'est une variable d'environnement. Et voyez-le sous les variables shell et les variables d'environnement

$ zzz=5

$ set | grep zzz
zzz=5

$ env | grep zzz

$ export yyy=5

$ set | grep yyy
yyy=5

$ env | grep yyy
yyy=5

$

autres fils utiles

/unix/176001/how-can-i-list-all-shell-variables

/ubuntu/26318/environment-variable-vs-shell-variable-whats-the-difference

Remarque - un point qui élabore un peu et corrige quelque peu ce que j'ai écrit, c'est que, sous Linux bash, 'set' peut être utilisé pour définir des "paramètres positionnels" et des "options / attributs du shell", et techniquement les deux ce sont des variables, bien que les pages de manuel puissent ne pas les décrire comme telles. Mais toujours, comme mentionné, set ne définira pas les variables shell ou les variables d'environnement). Si vous le faites, set asdfil définit $ 1 sur asdf, et si echo $1vous voyez asdf. Si tu faisset a=5il ne définira pas la variable a, égale à 5. Il définira le paramètre positionnel $ 1 égal à la chaîne de "a = 5". Donc, si vous avez déjà vu set a = 5 sous Linux, c'est probablement une erreur à moins que quelqu'un ne veuille réellement cette chaîne a = 5, dans $ 1. L'autre chose que l'ensemble de Linux peut définir, ce sont les options / attributs du shell. Si vous définissez -o, vous en voyez une liste. Et vous pouvez faire par exemple set -o verbose, off, pour activer le bavardage (btw la valeur par défaut se trouve être désactivée mais cela ne fait aucune différence). Ou vous pouvez le faire set +o verbosepour désactiver le bavardage. Windows n'a pas une telle utilisation pour sa commande set.


ressemble à l'ensemble montre le shell et l'environnement, et 'env' ne montre que l'environnement
barlop

1
J'aime beaucoup cette réponse car elle couvre les cas nix vs win qui peuvent être déroutants au début.
N0thing

6

En termes simples, les variables d'environnement sont définies lorsque vous ouvrez une nouvelle session shell. À tout moment, si vous modifiez l'une des valeurs de variable, le shell n'a aucun moyen de sélectionner ce changement. cela signifie que les modifications que vous avez apportées deviennent effectives dans les nouvelles sessions shell. La exportcommande, quant à elle, offre la possibilité de mettre à jour la session shell en cours sur la modification que vous avez apportée à la variable exportée. Vous n'avez pas besoin d'attendre une nouvelle session shell pour utiliser la valeur de la variable que vous avez modifiée.


1
Mais si je dis a=5alors echo $aalors il dit 5. Pourtant, vous avez écrit "à tout moment si vous modifiez l'une des valeurs de variable, le shell n'a aucun moyen de choisir ce changement. Cela signifie que les changements que vous avez faits deviennent effectifs dans les nouvelles sessions du shell." . <- Alors, comment a-t-il mis à jour la session shell sans exportation. Pouvez-vous donner un exemple où l'exportation est nécessaire?
barlop

La variable que vous définissez lors d'une session shell est une variable shell. il est local et accessible à la session shell actuelle. vous pouvez le modifier à tout moment et sa valeur actuelle sera disponible pour le processus shell actuel sans qu'il soit nécessaire d'exporter les modifications. d'autre part, les variables d'environnement sont définies au moment de la connexion. lorsque vous modifiez l'une de leurs valeurs, vous devez effectuer ce qui serait en termes simples une actualisation rendant la nouvelle valeur disponible à la fois pour le processus shell actuel et pour tout nouveau processus enfant. c'est exactement ce que fait l'exportation.
katwekibs
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.