Que signifie exporter PATH = quelque chose: $ PATH signifie?

27

Je suis très nouveau sur Linux et je mets la commande suivante à la fin du fichier .profilesous mon dossier personnel:

export PATH="~/.composer/vendor/bin:$PATH"

Je connais un peu les problèmes des variables d'environnement et de leurs valeurs sous Windows, mais dans ce cas, je veux comprendre ce que fait cette commande et quelles sont les parties qu'elle comprend:

  1. Quelle est cette expression "d'exportation" au début? Exporte-t-il les données pour qu'elles soient disponibles pour Bash?

  2. Quel est le premier PATHet quel est le second $PATH, et pourquoi en avons-nous besoin de deux?

JohnDoea
la source
Mis à part quelques différences techniques entre les systèmes d'exploitation, il est équivalent à ce processus sous Windows: windowsitpro.com/systems-management/…
Two-Bit Alchemist
1
"export" rend le changement visible pour les nouveaux programmes lancés par bash.
Thorbjørn Ravn Andersen
1
@ ThorbjørnRavnAndersen: non, cela se produit que vous utilisiez ou non la exportcommande, car la PATHvariable est déjà marquée comme exportée. (Essayez-les dans les deux sens si vous ne me croyez pas!)
David

Réponses:

39

Quelle est cette expression "d'exportation" au début?

exportest une commande (plus précisément c'est une fonction intégrée de Bash , c'est-à-dire que ce n'est pas un exécutable présent dans PATH, c'est une commande que Bash a intégrée en elle-même).

Exporte-t-il les données pour qu'elles soient disponibles pour Bash?

exportdéfinit la variable d'environnement sur le côté gauche de l'affectation à la valeur sur le côté droit de l'affectation; cette variable d'environnement est visible pour le processus qui la définit et pour tous les sous-processus générés dans le même environnement, c'est-à-dire dans ce cas, l'instance Bash qui source ~/.profileet tous les sous-processus générés dans le même environnement (qui peuvent inclure par exemple également d'autres shells , qui pourra à son tour y accéder).

Quel est le premier PATHet quel est le second $PATH, et pourquoi en avons-nous besoin de deux?

La première, PATHcomme expliqué ci-dessus, est la variable d'environnement à définir à l'aide de export.

Depuis PATHcontient normalement quelque chose quand ~/.profileest source (par défaut , il contient /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games), la mise simplement PATHà ~/.composer/vendor/binne rendent PATHcontenir que ~/.composer/vendor/bin.

Ainsi, étant donné que les références à une variable dans une commande sont remplacées par (ou "développées" pour) la valeur de la variable par Bash au moment de l'évaluation de la commande , :$PATHest placée à la fin de la valeur à affecter PATHafin que PATHfinisse par contenir ~/.composer/vendor/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games( c'est-à-dire ce qui PATHcontient déjà plus ~/.composer/vendor/bin:au début).

kos
la source
Super explication.
Choylton B. Higginbottom
16

https://help.ubuntu.com/community/EnvironmentVariables vous aidera probablement. man bashPeut également être très utile pour comprendre comment cela fonctionne (au moins dans Bash)

Quoi qu'il en soit - en ce qui concerne la PATH=définition de la PATHvariable, l'ajout de nouveaux chemins à rechercher, l'ajout à la fin de chemins déjà / précédemment définis, avec $PATH(qui est essentiellement une référence à la PATHvariable).

Donc, disons que vous PATHétiez jusqu'à présent réglé sur quelque chose comme:

PATH="x:y:z"

puis vous définissez

PATH="a:b:c:$PATH"

votre PATHaprès ce sera comme:

a:b:c:x:y:z

J'espère que cela à du sens.

Et en plus de cela, vous exportez la nouvelle variable afin qu'elle soit connue dans votre environnement, y compris également les processus / sous-coquilles enfants.

Sachez également que l'ordre des répertoires défini dans PATHpeut être important. Et quelque chose comme ça PATH="$PATH:a:b:c"vous donnera le résultat:

x:y:z:a:b:c

ce qui affectera l'ordre des répertoires / chemins lors de la recherche d'une commande (si vous avez votre commande dans plusieurs répertoires, le premier trouvé sera utilisé - ce qui peut vous donner parfois des résultats inattendus).

Jacek
la source
2

Voici la commande pour que tout le monde puisse suivre les étapes. export PATH="~/.composer/vendor/bin:$PATH"

  • exportshell intégré (ce qui signifie qu'il n'y a pas /bin/export, c'est une chose shell) commande essentiellement les variables d'environnement disponibles pour d'autres programmes appelés depuis bash(voir la question liée dans Extra Reading) et les sous-coquilles.
  • L'affectation dans le shell prendra l'expansion en premier, puis l'affectation aura lieu en second. Ainsi, ce qui se trouve à l'intérieur des guillemets doubles est développé en premier, puis enregistré dans une PATHvariable.
  • $PATHest l' PATHaffectation par défaut (ou du moins à quoi ressemble la variable jusqu'à ce que cette commande apparaisse dans votre .bashrcou .profile), et développez-la.
  • ~/.composer/vendor/binva se développer vers /home/username/.composer/vendor/bin, où se .composertrouve le dossier caché en raison du premier point.
  • Ce court métrage ~/.composer/vendor/bin:$PATHs'est maintenant transformé en une longue liste de dossiers, séparés par :. Tout est entouré de guillemets doubles afin que nous incluions des dossiers avec des espaces sur leur chemin.
  • Enfin tout est stocké dans PATHdes commandes variables et externes autorisées à l'utiliser

Exemple simple

Mon shell interactif est en fait mksh, qui se trouve également avoir exportintégré. En utilisant exportpour définir VAR, ma variable peut être passée à et utilisée par une chaîne de commandes / sous-processus ultérieure, où j'ai exporté cette même variable

$ echo $SHELL            
/bin/mksh
$ VAR="HelloAskUbuntu"
$ bash -c 'echo $VAR' 
$ export VAR="HelloAskUbuntu"                                                  
$ bash -c 'echo $VAR'                                                          
HelloAskUbuntu
$ 

Lecture supplémentaire

Sergiy Kolodyazhnyy
la source
3
Non, l' ~in ~/.composer/vendor/binne sera pas étendu! Le tilde n'est développé que dans quelques endroits spéciaux, comme directement après le =signe. PATH="~/.foo:$PATH"résulte en ~/.foo:/other/path/dirs.... Mais ~serait élargi PATH=~"/.foo:$PATH", ce qui se traduit par /home/user/.foo:/other/path/dirs....
Volker Siegel
2

J'ai lu ici et dans d'autres endroits du Web, parlé à un ami à ce sujet et décidé qu'en tant que étudiant de première année (peut-être plus d'un étudiant de première année d'Ubuntu que certains ici pourraient penser), je devrais mapper cette commande - je devrais faire une carte et ainsi apprenez ce que c'est et où:

Données préliminaires

Si pour l'instant vous n'avez pas compris quelque chose dans ce chapitre - ne vous inquiétez pas, cela deviendra plus clair au fur et à mesure que vous continuerez à lire, mais pour comprendre cette question, vous devez lire les variables d'environnement (EV), leurs valeurs et leur objectif. . Je vais maintenant essayer d'expliquer la commande en termes simples et dans une méthode de mappage, pour les nouveaux arrivants comme moi, et uniquement pour les nouveaux arrivants. J'ai essayé de faire de mon mieux ici ...

Cartographie

export PATH="~/.composer/vendor/bin:$PATH"

La valeur d'origine de l'EV "PATH" tel qu'il est fourni avec Ubuntu 15.10 est:

/usr/bin:/usr/sbin

Dans la commande elle-même, nous avons deux phrases PATH. Le dernier est $ PATH - Le $ indique "imprimer la ou les valeurs d'origine de l'EV à côté de vous"; Le EV à côté est le PATH EV.

Nous avons exporté la variable de chemin d'accès elle-même (elle est également disponible pour les sous-processus, les processus IE qui s'exécutent dans la CLI qui ne sont pas réellement le shell Bash, mais s'exécutent à l'intérieur (comme Drush , qui est la Drupal CLI).

Outre l'exportation, nous l'avons également développée: la première phrase PATH (PATH =) nous a permis d'ajouter une valeur supplémentaire (~ / .composer / vendor / bin :) à la valeur d'origine (représentée par $ PATH).

  • Les deux points (:) à la fin de la nouvelle valeur que j'ai mentionnée dans le paragraphe ci-dessus, permettent de distinguer la nouvelle valeur de celle d'origine.

  • Les "" sont la zone dans laquelle résident la ou les valeurs.

  • Le ~ est le dossier de départ.


J'espère qu'après cette cartographie, la commande sera plus claire pour les étudiants de première année comme moi.

JohnDoea
la source
1

La exportcommande rend les variables disponibles dans les sous-coquilles. Autrement dit, sans elle, la variable PATHne serait pas visible dans les sous-coques.

PATH est mentionné deux fois:

  • En tant que variable, la valeur est affectée à gauche du =signe.
  • Comme nom de variable remplacé par sa valeur à droite du =signe. Cela fait que l'ancienne valeur fait partie de la nouvelle valeur.
rexkogitans
la source
1
"Autrement dit, sans elle, la variable PATHne serait pas visible dans les sous-coques." Ceci est une erreur; PATHest une variable d' environnement (qui n'est pas tout à fait la même chose qu'une variable shell ), elle est donc automatiquement exportée et la exportcommande n'est pas nécessaire.
David
La famille de shell Bourne ne fait pas vraiment de distinction entre le shell et les variables d'environnement. ( sc.tamu.edu/help/general/unix/vars.html ) Sur mon système (Arch Linux), bash ne connaît même pas la setenvcommande.
rexkogitans
1
Il y a toujours une différence entre les variables d'environnement connues du noyau et les variables de shell internes à bash. Comme il PATHprovient de l'environnement, il est automatiquement exporté, vous n'avez donc pas besoin d'exécuter exportpour que les modifications soient propagées aux processus enfants (contrairement à ce que dit la page que vous avez liée).
David
Les variables d'environnement ne sont pas une propriété du noyau, mais du processus. Puisque le processus dont nous parlons ici est sh, bash (Ubuntu utilise-t-il zsh?), Je pense que nous pouvons les laisser égaux aux variables du shell. Mais, bien entendu, les variables shell ne sont transmises à aucun programme aléatoire comme le sont les variables d'environnement.
rexkogitans
Je pense que nous nous enlisons dans la sémantique à ce stade. Tout ce que j'essayais de dire, c'est que dans bash, PATH=fooet export PATH=fooj'ai un comportement identique.
David
0
export PATH="~/.composer/vendor/bin:$PATH"
  1. la exportest une commande buildin de bash, des moyens exporter des variables à être variable envirement. (vous pouvez taper help exportpour vous pencher plus

    (les caractères suivent la commande sont des paramètres, divisés par l'espace, donc dans ce cas, il n'y a qu'un seul paramètre)

  2. l' PATHest le nom de la variable, généralement, varibale prédéfini par bash, être nommé dans Majuscules.

  3. les =moyens attribuent une valeur à cette variable.

  4. toute la chaîne est la valeur de la varibale

  5. la $PATHest une sorte de funciton de bash, nommé variable expantion, bash remplacera la valeur de l'exist PATHdans la chaîne de paramètres, envoyer avant la chaîne de exportcommande

  6. le :dans un caractère spécial dans la variable PATH et compris par toutes les applications qui souhaitent utiliser cette variable. cela signifie séparateur. ils auront donc beaucoup de répertoires dans la variable PATH.

Lovespring
la source