Je me demande où il faut ajouter un nouveau chemin à la variable d'environnement PATH
. Je sais que cela peut être fait en modifiant le fichier .bashrc
(par exemple), mais la façon de procéder n'est pas claire.
De cette façon :
export PATH=~/opt/bin:$PATH
ou ceci ?
export PATH=$PATH:~/opt/bin
PATH=$PATH:~/opt/bin
ou
PATH=~/opt/bin:$PATH
selon que vous voulez ajouter ~/opt/bin
à la fin (pour être recherché après tous les autres répertoires, au cas où il y aurait un programme du même nom dans plusieurs répertoires) ou au début (pour être recherché 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 de cet ordre fonctionnent très bien. Ne mettez pas export
au début de la ligne car cela entraîne des complications supplémentaires (voir plus bas dans "Notes sur les shells autres que bash").
Si votre PATH
est construit par plusieurs composants différents, vous pouvez vous retrouver avec des entrées dupliquées. Consultez https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command et https://unix.stackexchange.com/questions/40749/remove-duplicate-path-entries-with-awk-command pour éviter d'ajouter des doublons ou les supprimer.
Certaines distributions mettent automatiquement ~/bin
dans votre PATH s'il existe, d'ailleurs.
Mettez la ligne pour modifier PATH
dans ~/.profile
, ou dans ~/.bash_profile
si c'est ce que vous avez.
Notez que ~/.bash_rc
n'est lu par aucun programme, et que ~/.bashrc
est le fichier de configuration des instances interactives de bash. Vous ne devriez pas définir de variables d'environnement dans ~/.bashrc
. Le bon endroit pour définir des variables d'environnement telles que PATH
est ~/.profile
(ou ~/.bash_profile
si vous ne vous souciez pas des shells autres que bash). Voir Quelle est la différence entre les deux et lequel dois-je utiliser ?
Ne le mettez pas dans /etc/environment
ou ~/.pam_environment
: ce ne sont pas des fichiers shell, vous ne pouvez pas y utiliser des substitutions comme $PATH
. Dans ces fichiers, vous pouvez seulement remplacer une variable, pas en ajouter une.
Vous n'avez pas besoin de export
si la variable est déjà dans l'environnement : tout changement de la valeur de la variable est reflété dans l'environnement.¹ PATH
est presque toujours dans l'environnement ; tous les systèmes unix le définissent très tôt (habituellement dans le tout premier processus, en fait).
Au moment de la connexion, vous pouvez compter sur le fait que PATH
est déjà dans l'environnement, et qu'il contient déjà certains répertoires du système. Si vous écrivez un script qui peut être exécuté très tôt lors de la mise en place d'une sorte d'environnement virtuel, vous pouvez avoir besoin de vous assurer que PATH
est non vide et exporté : si PATH
n'est toujours pas défini, alors quelque chose comme PATH=$PATH:/some/directory
définira PATH
comme :/some/directory
, et le composant vide au début signifie le répertoire courant (comme .:/some/directory
).
if [ -z "${PATH-}" ]; then export PATH=/usr/local/bin:/usr/bin:/bin; fi
Dans bash, ksh et zsh, export
est une syntaxe spéciale, et PATH=~/opt/bin:$PATH
et export PATH=~/opt/bin:$PATH
font tous deux la bonne chose. Dans d'autres shells de style Bourne/POSIX tels que dash (qui est /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 affectations (voir https://unix.stackexchange.com/questions/25605/how-to-add-home-directory-path-to-be-discovered-by-unix-which-command/25704#25704 pour plus de détails) ;$PATH
en dehors des guillemets doubles [s'interrompt si PATH
contient des espaces ou [*?
](https://unix.stackexchange.com/questions/131766/why-does-my-shell-script-choke-on-whitespace-or-other-special-characters).Ainsi, dans des shells comme dash, définit export PATH=~/opt/bin:$PATH
PATH
à la chaîne littérale ~/opt/bin/:
suivie de la valeur de PATH
jusqu'au premier espace.
PATH=~/opt/bin:$PATH
(une affectation simple) ne nécessite pas de guillemets et fait la bonne chose. Si vous voulez utiliser export
dans un script portable, vous devez écrire export PATH="$HOME/opt/bin:$PATH"
, ou PATH=~/opt/bin:$PATH ; export PATH
(ou PATH=$HOME/opt/bin:$PATH ; export PATH
pour la portabilité même du Bourne shell qui n'acceptait pas export var=value
et ne faisait pas d'expansion de tilde).
¹ Ce n'était pas vrai dans les shells Bourne (comme dans le véritable shell Bourne, pas les shells modernes de style POSIX), mais vous avez très peu de chances de rencontrer de tels anciens shells de nos jours.
Les deux méthodes fonctionnent, mais elles ne font pas la même chose : les éléments du PATH
sont vérifiés de gauche à droite. Dans votre premier exemple, les exécutables dans ~/opt/bin
auront la priorité sur ceux installés, par exemple, dans /usr/bin
, ce qui peut ou non être ce que vous voulez.
En particulier, d'un point de vue sécurité, il est dangereux d'ajouter des chemins au début, car si quelqu'un peut obtenir un accès en écriture à votre ~/opt/bin
, il peut y mettre, par exemple, un ls
différent, que vous utiliserez probablement à la place de /bin/ls
sans le remarquer. Imaginez maintenant la même chose pour ssh
ou votre navigateur ou autre... (La même chose vaut triplement pour mettre . dans votre chemin).
Je suis confus par la question 2 (retirée de la question car elle était due à un problème sans rapport) :
Quel est le moyen le plus efficace d'ajouter plusieurs chemins sur des lignes différentes ? Initialement, je pensais que ceci pourrait faire l'affaire :
export PATH=$PATH:~/opt/bin export PATH=$PATH:~/opt/node/bin
mais ce n'est pas le cas parce que la deuxième affectation n'ajoute pas seulement
~/opt/node/bin
, mais aussi l'ensemble duPATH
précédemment attribué.Voici une solution de contournement possible :
export PATH=$PATH:~/opt/bin:~/opt/node/bin
mais pour des raisons de lisibilité, je préférerais avoir une seule affectation pour un seul chemin.
Si vous dites
PATH=~/opt/bin
c'est tout ce qui sera dans votre PATH. 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. En d'autres termes, ce que vous donnez comme exemple à la question 2 est exactement ce que vous voulez faire, à moins que je ne manque totalement le but 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, pour tenir compte des répertoires potentiellement manquants :
export PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11
# add optional items to the path
for bindir in $HOME/local/bin $HOME/bin; do
if [ -d $bindir ]; then
PATH=$PATH:${bindir}
fi
done