J'aimerais trouver un moyen d'ajouter des éléments à $PATH, à l'échelle du système ou pour un utilisateur individuel, sans potentiellement ajouter le même chemin plusieurs fois.
Une des raisons de vouloir faire cela est que des ajouts puissent être faits dans .bashrc
, qui ne nécessite pas de connexion, et est également plus utile sur les systèmes qui utilisent (par exemple) lightdm
, qui n'appelle jamais .profile
.
Je suis au courant des questions concernant la façon de nettoyer les doublons de $PATH, mais Je ne veux pas supprimer les doublons . Je voudrais un moyen d'ajouter des chemins uniquement s'ils ne sont pas déjà présents.
Réponse acceptée :
Supposons que le nouveau chemin que nous voulons ajouter soit :
new=/opt/bin
Ensuite, en utilisant n'importe quel shell POSIX, nous pouvons tester pour voir si new
est déjà dans le chemin et ajoutez-le si ce n'est pas le cas :
case ":${PATH:=$new}:" in
*:"$new":*) ;;
*) PATH="$new:$PATH" ;;
esac
Notez l'utilisation des deux-points. Sans les deux-points, nous pourrions penser que, disons, new=/bin
était déjà dans le chemin car il correspondait au modèle sur /usr/bin
. Alors que les PATH ont normalement de nombreux éléments, les cas particuliers de zéro et un élément dans le PATH sont également gérés. Le cas où le PATH n'a initialement aucun élément (étant vide) est géré par l'utilisation de ${PATH:=$new}
qui assigne PATH
à $new
s'il est vide. Définir les valeurs par défaut des paramètres de cette manière est une fonctionnalité de tous les shells POSIX :voir la section 2.6.2 de la documentation POSIX.)
Une fonction appelable
Pour plus de commodité, le code ci-dessus peut être mis dans une fonction. Cette fonction peut être définie sur la ligne de commande ou, pour qu'elle soit disponible en permanence, placée dans le script d'initialisation de votre shell (pour les utilisateurs de bash, ce serait ~/.bashrc
):
pupdate() { case ":${PATH:=$1}:" in *:"$1":*) ;; *) PATH="$1:$PATH" ;; esac; }
Pour utiliser cette fonction de mise à jour du chemin pour ajouter un répertoire au PATH actuel :
pupdate /new/path