Je me demande où un nouveau chemin doit être ajouté à la PATH
variable d'environnement. Je sais que cela peut être accompli en éditant .bashrc
(par exemple), mais on ne sait pas comment faire cela.
Par ici:
export PATH=~/opt/bin:$PATH
ou ca?
export PATH=$PATH:~/opt/bin
PATH=$PATH:$HOME/.local/bin:$HOME/bin
, un autre peut être ajouté en séparant avec: par exemplePATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/ec2-user/pear/bin
.Réponses:
Le truc simple
ou
selon que vous voulez ajouter
~/opt/bin
à la fin (à rechercher après tous les autres répertoires, s'il existe un programme du même nom dans plusieurs répertoires) ou au début (à rechercher avant tous les autres répertoires).Vous pouvez ajouter plusieurs entrées en même temps.
PATH=$PATH:~/opt/bin:~/opt/node/bin
ou des variations sur le travail de commande très bien. Ne mettez pas de ligneexport
au début de la ligne car il y a des complications supplémentaires (voir ci-dessous «Notes sur les coquillages autres que bash»).Si votre
PATH
structure est construite à partir de nombreux composants différents, vous risquez de vous retrouver avec des entrées en double. Voir Comment ajouter le chemin du répertoire de départ à découvrir par la commande Unix? et Supprimez les entrées $ PATH en double avec la commande awk pour éviter d’ajouter ou de supprimer les doublons.Certaines distributions ajoutent automatiquement
~/bin
votre PATH s'il existe, d'ailleurs.Où le mettre
Mettez la ligne à modifier
PATH
dans~/.profile
, ou~/.bash_profile
si c'est ce que vous avez.Notez que ce programme
~/.bash_rc
n’est lu par aucun programme. Il~/.bashrc
s’agit du fichier de configuration des instances interactives de bash. Vous ne devez pas définir de variables d’environnement dans~/.bashrc
. Le bon endroit pour définir les variables d'environnement telles quePATH
est~/.profile
(ou~/.bash_profile
si vous ne vous souciez pas des shells autres que bash). Voir Quelle est la différence entre eux et lequel devrais-je utiliser?Ne le mettez pas
/etc/environment
ou~/.pam_environment
: ce ne sont pas des fichiers shell, vous ne pouvez pas utiliser de substitutions comme$PATH
ici. Dans ces fichiers, vous ne pouvez que remplacer une variable, pas l’ajouter.Complications potentielles dans certains scripts système
Vous n'avez pas besoin
export
si la variable est déjà dans l'environnement: toute modification de la valeur de la variable est reflétée dans l'environnement.¹PATH
est presque toujours dans l'environnement; tous les systèmes Unix le configurent très tôt (généralement lors du tout premier processus).Au moment de la connexion, vous pouvez compter sur votre
PATH
présence déjà dans l'environnement et sur certains répertoires système. Si vous écrivez un script qui peut être exécuté tôt lors de la configuration d'un environnement virtuel, vous devrez peut-être vous assurer qu'ilPATH
est non vide et exporté: siPATH
est toujours nonPATH=$PATH:/some/directory
défini , quelque chose comme serait définiPATH
sur:/some/directory
, et le composant vide au début signifie le répertoire en cours (comme.:/some/directory
).Notes sur les coquillages autres que bash
En bash, ksh et zsh,
export
est une syntaxe spéciale, et les deuxPATH=~/opt/bin:$PATH
etexport PATH=~/opt/bin:$PATH
font même la bonne chose. Dans d'autres shells de style Bourne / POSIX, tels que dash (/bin/sh
sur de nombreux systèmes),export
est analysé comme une commande ordinaire, ce qui implique deux différences:~
n'est analysé qu'au début d'un mot, sauf dans les assignations (voir Comment ajouter le chemin du répertoire de départ à découvrir par Unix quelle commande? pour plus de détails);$PATH
les guillemets extérieurs se cassent siPATH
contient des espaces ou\[*?
.Ainsi, dans les shells comme dash,
définitexport PATH=~/opt/bin:$PATH
PATH
la chaîne littérale~/opt/bin/:
suivie de la valeurPATH
allant jusqu'au premier espace.PATH=~/opt/bin:$PATH
(une affectation simple) ne nécessite pas de citations et fait la bonne chose. Si vous voulez utiliserexport
dans un script portable, vous devez écrireexport PATH="$HOME/opt/bin:$PATH"
, ouPATH=~/opt/bin:$PATH; export PATH
(ouPATH=$HOME/opt/bin:$PATH; export PATH
pour la portabilité même du shell Bourne qui n'a pas acceptéexport var=value
et n'a pas fait l'expansion du tilde).¹ Ce n’était pas le cas dans les coquillages Bourne (comme dans le shell Bourne actuel, mais pas dans le style POSIX moderne), mais il est peu probable que vous rencontriez de tels coquillages de nos jours.
la source
export
..bashrc
. Je suppose que parce que FZF est écrit en rouille aussi, il suit le modèle de rouille.Dans les deux cas, cela fonctionne, mais ils ne font pas la même chose: les éléments de
PATH
sont vérifiés de gauche à droite. Dans votre premier exemple, les exécutables de~/opt/bin
ont priorité sur ceux installés, par exemple dans/usr/bin
, ce qui peut être ou ne pas être ce que vous voulez.En particulier, du point de vue de la sécurité, il est dangereux d’ajouter des chemins au premier plan, car si quelqu'un peut obtenir un accès en écriture à votre
~/opt/bin
, il peut, par exemple, en insérer un différentls
, que vous utiliseriez probablement à la place. de/bin/ls
sans remarquer. Maintenant, imaginez la même chose pourssh
votre navigateur ou votre choix ... (La même chose vaut pour mettre. Sur votre chemin.)la source
ls
, vous devez la mettre dans un répertoire avant/bin
.Je suis confus par la question 2 (depuis retirée de la question car elle était due à une question non liée):
Si tu le dis
c'est tout ce qui sera dans votre CHEMIN. PATH est juste une variable d’environnement, et si vous voulez ajouter à PATH, vous devez reconstruire la variable avec exactement le contenu que vous voulez. C'est-à-dire que ce que vous donnez comme exemple à la question 2 correspond exactement à ce que vous voulez faire, à moins que je manque totalement le sens de la question.
J'utilise les deux formes dans mon code. J'ai un profil générique que j'installe sur chaque machine sur laquelle je travaille et qui ressemble à ceci, afin de prendre en charge les répertoires potentiellement manquants:
la source
La méthode à toute épreuve pour ajouter / préparer
Le choix de l'ajout ou de l'ajout au début dépend de nombreuses considérations. Beaucoup d’entre eux sont couverts par d’autres réponses, je ne les répéterai donc pas ici.
Un point important est que, même si les scripts système ne l'utilisent pas (je me demande pourquoi) * 1 , la méthode à toute épreuve pour ajouter un chemin (par exemple,
$HOME/bin
) à la variable d'environnement PATH estpour ajouter (au lieu de
PATH="$PATH:$HOME/bin"
) etpour ajouter (au lieu de
PATH="$HOME/bin:$PATH"
)Cela évite les faux colon avant / arrière lorsqu’il
$PATH
est initialement vide, ce qui peut avoir des effets secondaires indésirables et peut devenir un cauchemar , difficile à trouver ( cette réponse traite brièvement du cas dans l’awk
avenir).Explication (à partir de l’ extension des paramètres du shell ):
Ainsi,
${PATH:+${PATH}:}
est étendu à: 1) rien, siPATH
est nul ou non défini , 2)${PATH}:
, siPATH
est défini.Note : Ceci est pour bash.
* 1 Je viens de constater que des scripts comme ceux-ci
devtoolset-6/enable
utilisent réellement cela,la source
Linux détermine le chemin de recherche de l'exécutable avec la
$PATH
variable d'environnement. Pour ajouter directory / data / myscripts au début de la$PATH
variable d'environnement, utilisez ce qui suit:Pour ajouter ce répertoire à la fin du chemin, utilisez la commande suivante:
Mais les précédentes ne suffisent pas, car lorsque vous définissez une variable d'environnement dans un script, cette modification est effective uniquement dans le script. Il n'y a que deux manières de contourner cette limitation:
Exemples:
L'inclusion incorpore fondamentalement le script "appelé" dans le script "appelant". C'est comme un #include in C. Donc c'est efficace dans le script ou le programme "appelant". Mais bien sûr, cela n’est efficace dans aucun programme ou script appelé par le programme appelant. Pour la rendre efficace tout au long de la chaîne d'appels, vous devez suivre le paramétrage de la variable d'environnement avec une commande d'exportation.
Par exemple, le programme shell bash incorpore le contenu du fichier .bash_profile par inclusion. Placez les 2 lignes suivantes dans .bash_profile:
met efficacement ces 2 lignes de code dans le programme bash. Ainsi, dans bash, la variable $ PATH inclut
$HOME/myscript.sh
, et à cause de l'instruction export, tous les programmes appelés par bash ont la$PATH
variable modifiée . Et comme tous les programmes que vous exécutez à partir d'une invite bash sont appelés par bash, le nouveau chemin d'accès est en vigueur pour tout ce que vous exécutez à partir de l'invite bash.En bout de ligne, pour ajouter un nouveau répertoire au chemin, vous devez l'ajouter ou le ajouter à la variable d'environnement $ PATH dans un script inclus dans le shell, et exporter la
$PATH
variable d'environnement.Plus d'informations ici
la source
Depuis un certain temps maintenant , je l' ai gardé avec moi deux fonctions
pathadd
etpathrm
qui aident à ajouter des éléments au chemin sans avoir à vous soucier de duplications.pathadd
prend un argument de chemin unique et unafter
argument facultatif qui, s’il est fourni, sera ajouté à la valeurPATH
sinon, il le précède.Dans presque toutes les situations, si vous ajoutez des éléments au chemin, vous voudrez probablement remplacer tout ce qui se trouve déjà dans le chemin. C'est pourquoi j'opte d'utiliser l'ajout par défaut.
Mettez-les dans n'importe quel script que vous souhaitez modifier l'environnement PATH et vous pouvez maintenant le faire.
Vous êtes assuré de ne pas ajouter au chemin s'il est déjà là. Si vous voulez maintenant vous assurer,
/baz/bat
c'est au début.Maintenant, n'importe quel chemin peut être déplacé vers l'avant s'il est déjà dans le chemin sans doubler.
la source
Je ne peux pas parler pour d'autres distributions, mais Ubuntu a un fichier, / etc / environment, qui est le chemin de recherche par défaut pour tous les utilisateurs. Étant donné que mon ordinateur n’est utilisé que par moi, je mets les répertoires que je veux dans mon chemin, sauf s’il s’agit d’un ajout temporaire que je mets dans un script.
la source
Il y a des cas où son utilisation
PATH=/a/b:$PATH
peut être considérée comme la manière "incorrecte" d'ajouter un chemin àPATH
:PATH
dans le même formulaire.PATH
dans un formulaire différent (c.-à-d. Un alias dû à l'utilisation de liens symboliques ou..
).PATH
début de quand il est destiné à remplacer d'autres entrées dansPATH
.Cette fonction (uniquement pour Bash) fait la "bonne chose" dans les situations ci-dessus (avec une exception, voir ci-dessous), renvoie des codes d'erreur et imprime de gentils messages pour les humains. Les codes d'erreur et les messages peuvent être désactivés lorsqu'ils ne sont pas recherchés.
L'exception est que cette fonction ne canonise pas les chemins ajoutés à d'
PATH
autres moyens. Par conséquent, si un alias non canonique pour un chemin estPATH
présent, un doublon sera ajouté. Essayer dePATH
canoniser des chemins déjà dedans est une proposition risquée puisqu’un chemin relatif a une signification évidente lorsqu’il est passé à,prepath
mais quand déjà dans le chemin vous ne savez pas quel était le répertoire de travail actuel au moment de son ajout.la source
$PATH
que précédemment. Pour ce qui est-r
, non, je pense que les chemins relatifs entrés$PATH
sont trop peu fiables et étranges (votre chemin change à chaque foiscd
!) Pour vouloir prendre en charge quelque chose comme ça dans un outil général.Pour moi (sous Mac OS X 10.9.5), l’ajout du nom de chemin (par exemple
/mypathname
) au fichier/etc/paths
a très bien fonctionné.Avant édition,
echo $PATH
retourne:Après l'édition
/etc/paths
et le redémarrage du shell, la variable $ PATH est ajoutée/pathname
. En effet,echo $PATH
retourne:Ce qui est arrivé est que cela
/mypathname
a été ajouté à la$PATH
variable.la source
Pour ajouter un nouveau chemin à la
PATH
variable d'environnement:Pour que cette modification soit appliquée à chaque shell que vous ouvrez, ajoutez-la au fichier que le shell générera lors de son invocation. Dans différentes coquilles, cela peut être:
par exemple
Vous pouvez voir le chemin fourni dans la sortie ci-dessus.
la source
Voici ma solution:
Une belle doublure facile qui ne laisse pas de fuite
:
la source