BASH : quelle est la bonne pratique pour modifier la variable PATH?

Tags: #<Tag:0x00007f7adad19cf8>

Bonjour,

je lis souvent que pour modifier la variable PATH, comme par exemple pour chercher un exécutable dans /usr/bin/, qu’il faut mettre à la fin du fichier ~/.bashrc, la ligne :

export PATH=$PATH:/usr/bin

ok, c’est marche, mais pourquoi ne pas mettre tout simplement :

PATH=$PATH:/usr/bin , càd sans le mot export, alors que ça marche aussi ?

Donc quel est l’intérêt d’utiliser export si on peut tout simplement modifier la valeur de la variable PATH dans le fichier ~/.bashrc sans nécessairement utiliser export ?

D’autant plus que je trouve bizarre de mettre export PATH=$PATH:/usr/bin ou PATH=$PATH:/usr/bin dans le fichier ~/.bashrc, car à chaque fois que je me connecte à un shell « enfant » (ou sous-shell), le fichier ~/.bashrc va être exécuté à nouveau, et par conséquent, la valeur de la variable PATH va s’allonger, càd va devenir égale à $PATH:/usr/bin:/usr/bin:/usr/bin:/usr/bin:/usr/bin:/usr/bin:/usr/bin:/usr/bin:/usr/bin...

J’ai l’impression que modifier la variable PATH dans le fichier ~/.profile au lieu de ~/.bashrc serait plus adéquat, car le fichier ~/.profile n’est exécuté que lorsqu’un utilisateur est connecté à un shell de connexion (en utilisant la commande su avec l’option --login).

Donc, il y a un truc que j’ai pas compris sur l’intérêt de l’utilisation de export ?

1 J'aime

DANS .bashrc
si tu mets export PATH=$PATH… alors les shell enfant vont effectivement avoir plusieurs fois les même dossiers
mais si tu mets PATH=$PATH… alors les shell enfant nauront pas plusieurs fois les même dossiers

Quand tu utilise export il modifie la variable en cours pour les processus enfant mais sans modifier sa définition originelle.

Merci pour vos réponses, ça m’a aidé

en mettant PATH:$PATH:/sbin dans le fichier .bashrc de root, la valeur de PATH se rallonge de sbin à chaque fois que je me connecte à un shell enfant :

$ su toto

$ su root (donc .bashrc de root est exécuté) 
echo $PATH

....:/sbin

$ su root (donc .bashrc de root est à nouveau exécuté) 
echo $PATH
....:/sbin:/sbin

$ su root (donc .bashrc de root est à nouveau exécuté) 
echo $PATH
....:/sbin:/sbin:/sbin

ce qui est normal, car en faisant PATH=$PATH:/sbin dans le fichier .bashrc, je modifie la valeur de PATH qui a « déjà » été exporté auparavant dans le fichier /etc/profile

Donc j’ai fais ça dans le .bashrc de root (si on ne trouve pas le mot « sbin » dans la valeur de la variable $PATH, alors on rajoutera les différents chemins de sbin) :

if [[ ! $PATH =~ sbin ]]
then
        PATH=$PATH:/usr/local/sbin:/sbin:/bin:/usr/sbin:/sbin
        echo "PATH : "$PATH
fi

Ainsi :

$ su toto

$ su root
PATH:...:/sbin

$ su root
PATH:...:/sbin

$ su root
PATH:...:/sbin