Comment définir définitivement $ PATH sur Linux / Unix?

882

J'essaie d'ajouter un répertoire à mon chemin afin qu'il soit toujours dans mon chemin Linux. J'ai essayé:

export PATH=$PATH:/path/to/dir

Cela fonctionne, mais chaque fois que je quitte le terminal et démarre une nouvelle instance de terminal, ce chemin est perdu et je dois réexécuter la commande d'exportation.

Comment puis-je le faire pour que cela soit défini de manière permanente?

Cliquez Upvote
la source

Réponses:

231

Il existe plusieurs façons de procéder. La solution réelle dépend de l'objectif.

Les valeurs des variables sont généralement stockées dans une liste d'affectations ou dans un script shell exécuté au début de la session système ou utilisateur. Dans le cas du script shell, vous devez utiliser une syntaxe shell spécifique et / exportou des setcommandes.

À l'échelle du système

  1. /etc/environmentListe des affectations uniques, autorise les références. Parfait pour ajouter des répertoires à l'échelle du système comme /usr/local/something/bindes PATHvariables ou des définitions JAVA_HOME. Utilisé par PAM et SystemD.
  2. /etc/environment.d/*.confListe des affectations uniques, autorise les références. Parfait pour ajouter des répertoires à l'échelle du système comme /usr/local/something/bindes PATHvariables ou des définitions JAVA_HOME. La configuration peut être divisée en plusieurs fichiers, généralement un pour chaque outil (Java, Go, NodeJS). Utilisé par SystemD qui, par conception, ne transmet pas ces valeurs aux shells de connexion utilisateur.
  3. /etc/xprofileScript shell exécuté au démarrage de la session du système X Window. Ceci est exécuté pour chaque utilisateur qui se connecte au système X Window. C'est un bon choix pour les PATHentrées qui sont valables pour chaque utilisateur comme/usr/local/something/bin . Le fichier est inclus par un autre script, utilisez donc la syntaxe du shell POSIX et non la syntaxe de votre shell utilisateur.
  4. /etc/profileet /etc/profile.d/*script Shell. C'est un bon choix pour les systèmes shell uniquement. Ces fichiers sont lus uniquement par des shells en mode connexion.
  5. /etc/<shell>.<shell>rc. Script shell. C'est un mauvais choix car il est spécifique à un seul shell. Utilisé en mode sans connexion.

Session utilisateur

  1. ~/.pam_environment. Liste des affectations uniques, aucune référence autorisée. Chargé par PAM au début de chaque session utilisateur non pertinent s'il s'agit d'une session ou d'un shell du système X Window. Vous ne pouvez pas référencer d' autres variables , y compris HOMEou PATHil a un usage limité. Utilisé par PAM.
  2. ~/.xprofileScript shell. Ceci est exécuté lorsque l'utilisateur se connecte au système X Window System. Les variables définies ici sont visibles pour chaque application X. Choix parfait pour étendre PATHavec des valeurs telles que ~/binou ~/go/binou définir un utilisateur spécifique GOPATHou NPM_HOME. Le fichier est inclus par un autre script, utilisez donc la syntaxe du shell POSIX et non la syntaxe de votre shell utilisateur. Votre éditeur de texte graphique ou IDE démarré par raccourci verra ces valeurs.
  3. ~/.profile, ~/.<shell>_profile, ~/.<shell>_loginShell script. Il ne sera visible que pour les programmes démarrés depuis un terminal ou un émulateur de terminal. C'est un bon choix pour les systèmes shell uniquement. Utilisé par les shells en mode connexion.
  4. ~/.<shell>rc. Script shell. C'est un mauvais choix car il est spécifique à un seul shell. Utilisé par les shells en mode sans connexion.

Remarques

Gnome sur Wayland démarre le shell de connexion utilisateur pour obtenir l'environnement. Il utilise efficacement les configurations shell de connexion ~/.profile, ~/.<shell>_profile,~/.<shell>_login les fichiers.

Manuels

  • environnement
  • environnement.d
  • frapper
  • tiret

Documentation spécifique à la distribution

en relation

Différence entre le shell de connexion et le shell sans connexion?

Grzegorz Żur
la source
4
Merci pour la réponse détaillée, cela devrait être plus haut. Peut .bash_profile-être devrait - on également l'ajouter à la liste?
James Ko
2
@JamesKo qui était le numéro 4
trve.fa7ad
1
Je pense que la meilleure réponse est suggérée /etc/environment. Mais puis-je le rafraîchir sans me déconnecter ni me connecter? Parfois, je n'utilise pas bash ou sh, donc source /etc/environmentça ne marche pas.
banan3'14
2
Grande et à mon avis la réponse la plus complète. Devrait être beaucoup plus haut.
Peter Gloor
2
Ma raison de rechercher ce sujet était en fait Go. Heureux de voir que je ne suis pas le seul à avoir réalisé que .bashrc n'est pas le bon endroit. ;)
Peter Gloor
1039

Vous devez l'ajouter à votre fichier ~/.profileou ~/.bashrc. 

export PATH="$PATH:/path/to/dir"

Selon ce que vous faites, vous pouvez également créer un lien symbolique vers des fichiers binaires:

cd /usr/bin
sudo ln -s /path/to/binary binary-name

Notez que cela ne mettra pas automatiquement à jour votre chemin pour le reste de la session. Pour ce faire, vous devez exécuter:

source ~/.profile 
or
source ~/.bashrc
mpowered
la source
11
Quelques questions. 1) Ne devrait-il pas y avoir de deux points entre $PATHet /usr/bin. 2) Devrait /usr/binmême être là. 3) Ne devriez-vous pas plutôt l'utiliser /usr/local/bin?
Batandwa
197
Remarque : il est souvent considéré comme une faille de sécurité de laisser un signe deux-points à la fin de votre chemin BASH, car il fait en sorte que bash recherche dans le répertoire actuel s'il ne trouve pas l'exécutable qu'il recherche. Les utilisateurs qui trouvent ce message à la recherche de plus d'informations doivent en être informés.
erewok
51
@AdamRobertson Il est dangereux de considérer le scénario lorsque vous décompressez une archive tar, puis cddans le répertoire dans lequel vous l'avez décompressée, puis exécutez ls--- et réalisez ensuite que l'archive tar avait un programme malveillant appelé ls.
Lily Chung
21
Pour moi, c'était .bash_profile, pas .profile. Semble que c'est différent pour tout le monde.
donquixote
9
Je pense que j'ai considérablement amélioré la qualité de cette réponse et résolu quelques problèmes soulevés par d'autres utilisateurs. Chaque exportation de chemin, ou chaque commande qui ajuste le chemin, doit toujours s'assurer de séparer un chemin existant par deux points. Les deux-points avant ou arrière ne doivent jamais être utilisés et le répertoire courant ne doit jamais se trouver dans le chemin.
Erick Robertson
243

Dans Ubuntu, modifiez /etc/environment. Son seul but est de stocker les variables d'environnement. À l'origine, la variable $ PATH est définie ici. Ceci est une pâte de mon /etc/environmentfichier:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"

Vous pouvez donc simplement ouvrir ce fichier en tant que root et ajouter ce que vous voulez.

Pour des résultats immédiats, exécutez (essayez en tant qu'utilisateur normal et root):

source /etc/environment && export PATH

MISE À JOUR:

Si vous utilisez zsh(alias Z Shell), ajoutez cette ligne juste après les commentaires dans /etc/zsh/zshenv:

source /etc/environment

J'ai rencontré cette petite bizarrerie sur Ubuntu 15.10, mais si votre zsh n'obtient pas le bon CHEMIN , cela pourrait être la raison

trve.fa7ad
la source
13
Tous les systèmes n'ont pas / etc / environment
user3439968
9
FWIW $PATHest également défini /etc/profiledans Arch Linux.
Sparhawk
3
@ e-sushi Je suis vraiment choqué par cela. Je suis moi-même sur Ubuntu 14.04.1. et je peux vous promettre que le fichier a été intégré.
trve.fa7ad
2
Après avoir essayé toutes les suggestions sous le soleil, mais / etc / environment, et les avoir toutes NON fonctionnées, je suis finalement tombé sur cela. Je suis également sur Ubuntu 14.04 et c'est le seul qui a réellement changé la variable PATH après les redémarrages.
Chockomonkey
4
L'utilisateur doit redémarrer le PC après la mise à jour du fichier d'environnement.
Harish_N
71

Mettez la exportdéclaration ~/.bashrc. Mon .bashrc contient ceci:

export PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATH
Fraxtil
la source
7
redémarrage nécessaire?
Cliquez Upvote
2
A fonctionné lorsque j'ai mis cela dans le .profile', je n'ai pas trouvé.bashrc
Cliquez sur Upvote
Cela peut dépendre du système exact; Je ne sais pas exactement quelles conditions déterminent quel fichier est exécuté. Heureux que le problème ait été résolu, cependant.
Fraxtil
12
@Click Upvote Vous devez faire source ~/.bashrcpour recharger la .bashrcconfiguration. Ensuite, cela fonctionnera
BigSack
4
Le exportmot clé n'est nécessaire que s'il PATHn'est pas déjà signalé comme variable d'environnement - ce qu'il sera presque inconditionnellement. Cela PATH=/var/lib/gems/1.8/bin:/home/fraxtil/.bin:$PATHaurait simplement le même effet.
Charles Duffy
30

Vous pouvez définir de $PATHfaçon permanente de 2 façons.

  1. Pour définir le chemin d'accès d'un utilisateur particulier: Vous devrez peut-être effectuer l'entrée .bash_profiledans le répertoire personnel de l'utilisateur.

    par exemple dans mon cas, je définirai le chemin java dans le profil utilisateur tomcat

    [tomcat]$ echo "export PATH=$PATH:/path/to/dir" >> /home/tomcat/.bash_profile
  2. Pour définir un chemin commun pour TOUS les utilisateurs du système, vous devrez peut-être définir un chemin comme celui-ci:

    [root~]# echo "export PATH=$PATH:/path/to/dir" >> /etc/profile
Mohit M
la source
3
Le fichier est-il nommé /etc/profilesavec un ssur votre distribution? Le mien n'a pas s. Je pense que vous avez une faute de frappe.
Chris Johnson
3
Vous voulez probablement échapper au $ que vous écrivez dans le fichier de profil. par exemple echo "export PATH = \ $ PATH: / path / to / dir" >> / etc / profile, de cette façon, vous ajoutez réellement à la variable lorsque ce script s'exécute plutôt que de lui donner une valeur littérale basée sur sa valeur à la moment de l'exécution de cette commande initiale.
BuvinJ
15

Vous pouvez utiliser sur Centos ou RHEL pour l'utilisateur local:

echo $"export PATH=\$PATH:$(pwd)" >> ~/.bash_profile

Cela ajoute le répertoire actuel (ou vous pouvez utiliser un autre répertoire) au PATH, cela le rend permanent mais prend effet à la prochaine ouverture de session utilisateur.

Si vous ne souhaitez pas vous reconnecter, vous pouvez utiliser:

source ~/.bash_profile

Ce rechargement de # User specific environment and startup programsce commentaire est présent dans.bash_profile

Daniel Antonio Nuñez Carhuayo
la source
12

Vous pouvez également définir de manière permanente, en modifiant l'un de ces fichiers:

/etc/profile (pour tous les utilisateurs)

~/.bash_profile (pour l'utilisateur actuel)

~/.bash_login (pour l'utilisateur actuel)

~/.profile (pour l'utilisateur actuel)

Vous pouvez également utiliser /etc/environmentpour définir une variable d'environnement PATH permanente, mais elle ne prend pas en charge l'expansion de variable .

Extrait de: http://www.sysadmit.com/2016/06/linux-anadir-ruta-al-path.html

Delucaramos
la source
7

Je suis tombé sur cette question hier lors de la recherche d'un moyen d'ajouter un dossier contenant mes propres scripts au PATH - et j'ai été surpris de découvrir que mon propre ~/.profilefichier (sur Linux Mint 18.1) contenait déjà ceci:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Ainsi, tout ce que j'avais à faire était de créer le dossier ~/binet d'y mettre mes scripts.

RobertG
la source
7

Je pense que la manière la plus élégante est:

1. ajoutez ceci dans le fichier ~ / .bashrc Exécutez cette commande

gedit ~ / .bashrc

ajoutez votre chemin à l'intérieur

export PATH = $ PATH: / opt / node / bin

2. source ~ / .bashrc

(Ubuntu)

Himanshu sharma
la source
6

Vous pouvez ajouter cette ligne à votre fichier de configuration de console (par exemple .bashrc), ou à .profile

aqua
la source
2
Je n'ai aucun de ces fichiers dans/home/(username)
Cliquez sur Upvote
3
@ClickUpvote: Quel shell utilisez-vous? (Et les fichiers qui commencent par un point sont cachés, vous avez besoin de quelque chose comme ls -apour les voir.)
David Schwartz
Dans le cas où vous n'avez aucun de ces fichiers (bashrc ou profil), vous pouvez les créer manuellement et ils seront automatiquement utilisés
trve.fa7ad
4

Ajouter définitivement la variable PATH

Global:

echo "export PATH=$PATH:/new/path/variable" >> /etc/profile

Local (pour utilisateur uniquement):

echo "export PATH=$PATH:/new/path/variable" >> ~/.profile

Pour un redémarrage global . Pour la reconnexion locale .

Exemple

Avant:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin

Après:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Alternativement, vous pouvez simplement modifier le profil:

$ cat /etc/profile 

#!/bin/sh

export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/new/path/variable

Une autre façon (merci gniourf_gniourf):

echo 'PATH=$PATH:/new/path/variable' >> /etc/profile

Vous ne devez pas utiliser de guillemets doubles ici! echo 'export PATH = $ PATH: / new / path / variable' ... Et au fait, le mot-clé export est très probablement inutile car la variable PATH est très probablement déjà marquée comme exportée. - gniourf_gniourf

user3439968
la source
1
Nan. Vous ne devez pas utiliser de guillemets doubles ici! echo 'export PATH=$PATH:/new/path/variable'... Et au fait, le exportmot-clé est très probablement inutile car la PATHvariable est très probablement déjà marquée comme exportée.
gniourf_gniourf
Non, vous devez utiliser des guillemets doubles car $ PATH entre guillemets simples n'est pas interpolé. Et l'exportation BTW est également utile.
user3439968
J? ai compris. Vous pouvez utiliser des guillemets doubles ou des guillemets simples, car $ PATH interpole lorsque l'écho est exécuté ou interpole lorsque / etc / profile s'exécute.
user3439968
1
@ user3439968 en fait, les guillemets doubles causeront beaucoup de problèmes si vous deviez ajouter à $ PATH à partir de plusieurs fichiers. Considérez: lorsque vous utilisez des guillemets doubles, $ PATH est traduit en une chaîne statique avec tous les répertoires PATH précédemment définis. dites que vous y ajoutez /usr/localen utilisant ~/.bashrc. maintenant si vous avez l'intention d'ajouter /opt/binà la même variable en utilisant /etc/bash.bashrc; $ PATH se traduira dans la même chaîne statique, par conséquent $ PATH sera remplacé au lieu d'être ajouté à ... Ce sera une question de préférence du système pour un fichier plutôt qu'un autre
trve.fa7ad
4

1. modifiez le fichier "/ etc / profile".

#vi /etc/profile

Appuyez sur la touche "i" pour entrer le statut d'édition et déplacez le curseur à la fin du fichier, Entrées supplémentaires:

export PATH=$PATH:/path/to/dir;

Appuyez sur la touche "Echap" pour quitter le statut d'édition, ': wq' enregistrez le fichier.

2. rendre la configuration efficace

source /etc/profile

Expliquez: le fichier de profil fonctionne pour tous les utilisateurs, si vous souhaitez être valide uniquement pour l'utilisateur actif, définissez le fichier ".bashrc"

Jia
la source
4

Après tant de recherches, j'ai trouvé une solution simple pour cela (j'utilise un OS élémentaire ), inspiré par le lien suivant .

Exécutez la commande suivante pour ouvrir le fichier .bashrc en mode édition . [Vous pouvez également utiliser vi ou tout autre éditeur].

~$ sudo nano ~/.bashrc

Ajoutez la ligne suivante à la fin du fichier et enregistrez.

export PATH="[FLUTTER_SDK_PATH]/flutter/bin:$PATH"

Par exemple :

export PATH="/home/rageshl/dev/flutter/bin:$PATH"

entrez la description de l'image ici

Je crois que c'est le permanent solution pour définir le chemin du flutter dans la distribution Ubuntu

J'espère que cela vous sera utile.

Ragesh S
la source
3

les fichiers dans lesquels vous ajoutez la commande d'exportation dépendent si vous êtes en mode connexion ou non.

si vous êtes en mode connexion, les fichiers que vous recherchez sont / etc / bash ou /etc/bash.bashrc

si vous êtes en mode hors connexion, vous recherchez le fichier /.profile ou les fichiers du répertoire /.profiles.d

les fichiers mentionnés ci-dessus si où sont les variables système.

Dikinha
la source
3

Ajouter au /etc/profile.ddossier de script [name_of_script].shavec la ligne: export PATH=$PATH:/dir. Chaque script dans le /etc/profile.ddossier est automatiquement exécuté par /etc/profilelors de la connexion.

Yuriy
la source
Il est recommandé de personnaliser votre environnement
Yuriy
1
C'est seulement si vous voulez que les paramètres soient à l'échelle du système, ce qui n'est probablement pas le cas d'utilisation le plus courant. La plupart des gens veulent (ou devraient vouloir) que le chemin d'accès soit défini localement, car la plupart des utilisateurs / rôles effectuent des opérations contextuellement différentes, et moins il y a d'hypothèses, mieux c'est.
mpowered
@mpowered, oui, ce n'est que pour l'ensemble du système. Si vous souhaitez modifier localement le CHEMIN, vous devez ajouter la même exportation dans ~ / .profile ou ~ / .bashrc. Ici, vous devez considérer que les shells de connexion lisent ~ / .profile et les shells interactifs lisent ~ / .bashrc. Ceci est très important car ssh par exemple ne fait pas de connexion, donc ~ / .profile ne sera pas lu. Plusieurs distributions comme suse source ~ / .bashrc dans / etc / profile. Mais ce n'est pas courant pour tout Linux '
Yuriy
3

Zues77 a la bonne idée. L'OP n'a pas dit "comment puis-je me frayer un chemin à travers cela". OP voulait savoir comment ajouter de façon permanente à $ PATH:

sudo nano /etc/profile

C'est là qu'il est réglé pour tout et est le meilleur endroit pour le changer pour tout ce qui nécessite $ PATH

Joe D
la source
3

Ma réponse se réfère à la création de go-lang sur. Ubuntu linux/amd64J'ai rencontré le même problème pour définir le chemin des variables d'environnement ( GOPATHet GOBIN), le perdre à la sortie du terminal et le reconstruire en utilisant à source <file_name>chaque fois. L'erreur était de mettre le chemin ( GOPATHet GOBIN) dans le ~/.bash_profiledossier. Après avoir perdu quelques bonnes heures, j'ai trouvé que la solution était de mettre GOPATHet GOBINdans le ~/.bash_rcfichier de la manière:

export GOPATH=$HOME/go
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOPATH:$GOBIN

et ce faisant, l'installation go a bien fonctionné et il n'y a eu aucune perte de chemin.

EDIT 1: La raison pour laquelle ce problème peut être lié est que les paramètres des shells sans connexion comme votre terminal ubuntu ou gnome-terminal où nous exécutons le code go sont tirés du ~./bash_rcfichier et les paramètres des shells de connexion sont tirés du ~/.bash_profilefichier, et du ~/.profilefichier si le ~/.bash_profilefichier est inaccessible.

Abhiroj Panwar
la source
3

Supposons que vous exécutez MacOS et que vous avez un binaire de confiance et que vous souhaitez rendre disponible sur votre système mais que vous ne voulez pas nécessairement le répertoire dans lequel le binaire doit être ajouté à votre PATH, vous pouvez choisir de copier / déplacer le binaire vers /usr/local/bin, qui devrait déjà être dans votre CHEMIN. Cela rendra l'exécutable binaire comme tout autre binaire auquel vous avez déjà accès dans votre terminal.

Leo
la source
3

Il peut être ajouté directement à l'aide de la commande suivante:

echo 'export PATH=$PATH:/new/directory' >> ~/.zshrc
source ~/.zshrc
Anoop Nagabhushan
la source
2
La question est libellée bash, donc ce n'est pas très utile.
Laurenz Albe
2
Ceci est une réponse valide -> le titre ne mentionne que Linux, donc bash et ALSO zsh feront l'affaire ... si le balisage n'est que "bash", nous devons également ajouter "zsh" aux balises
Carlos Saltos
2

la meilleure façon simple est la ligne suivante:
PATH="<directory you want to include>:$PATH"
dans votre fichier .bashrc dans le répertoire personnel.
Il ne sera pas réinitialisé même si vous fermez le terminal ou redémarrez votre PC. Son permanent

Edward Torvalds
la source
1
@quant si vous faites ce qui est dit, il définira vos paramètres de façon permanente. cela fonctionnera même si vous fermez le terminal.
Edward Torvalds
1

Je pense que la manière la plus élégante est:

1. ajoutez ceci dans le fichier ~. / Bashrc

if [ -d "new-path" ]; then
  PATH=$PATH:new-path
fi

2. source ~ / .bashrc

(Ubuntu)

Gimcuan Hui
la source
Et pour afficher le chemin après: printf "% s \ n" $ PATH
Robot70
1

une façon d'ajouter un chemin permanent, qui a fonctionné pour moi, est:

    cd /etc/profile.d
    touch custom.sh
    vi custom.sh 
    export PATH=$PATH:/path according to your setting/

redémarrez votre ordinateur et c'est parti!

user6393373
la source
Vous n'avez pas réellement besoin de redémarrer votre ordinateur. Se déconnecter et se reconnecter est suffisant. C'est une solution assez élégante car il est très facile d'annuler les modifications sans avoir à modifier les fichiers. Il est également facile de spécifier une instruction if de sorte que si un répertoire n'existe pas sur le système, il ne soit pas ajouté à la variable PATH.
Warwick
0

Pour la distribution Debian, vous devez:

    - edit ~/.bashrc  e.g: vim ~/.bashrc 
    - add export PATH=$PATH:/path/to/dir
    - then restart your computer. Be aware that if you edit ~/.bashrc  as root, your environment variable you added will work only for root
seulement moi
la source
0

Il s'agit d'une doublure . Il ajoute une ligne au fichier .bashrc. La ligne va vérifier si le répertoire a déjà été ajouté au chemin et l'ajouter sinon. Cela empêchera la duplication de votre répertoire dans le chemin à chaque fois que vous sourcez .bashrc.

echo "[[ \":\$PATH:\" != *\":$(pwd)/path/to/add:\"* ]] && export PATH=\"\${PATH:+\${PATH}}:$(pwd)/path/to/add\"" >> ~/.bashrc

source ~/.bashrc
sr9yar
la source