Je modifie fréquemment mon .bashrc, puis je le source. Cependant, lorsque j'ai des choses comme
export PATH="~/bin:~/perl5/bin:$PATH"
dans mon fichier, la PATH
variable d'environnement augmente chaque fois que je source le fichier.
Par exemple, la première fois que .bashrc est généré, la PATH
variable se compose de ~/bin:~/perl5/bin:/usr/bin:/bin
.
La deuxième fois, il se compose de ~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
La troisième fois, il se compose de ~/bin:~/perl5/bin:~/bin:~/perl5/bin:~/bin:~/perl5/bin:/usr/bin:/bin
.
Existe-t-il un moyen simple de ne faire qu'ajouter tout ce qui n'est pas déjà dans le CHEMIN?
/etc/profile
Debian Lenny, donc je l'inclus dans mon.bashrc
.pathmunge /some/path
aura lieu/some/path
au début$PATH
et sepathmunge /some/path after
terminera/some/path
à la fin de$PATH
if ! [[ $PATH =~ (^|:)$1($|:) ]] ; then
.pathmunge /foo before
ne fait pas cela. Une meilleure façon serait d'ajouter / foo au début puis de supprimer les doublons par la suite.J'avais ce problème, j'ai donc utilisé une combinaison de techniques répertoriées sur la question StackOverflow . Voici ce que j'ai utilisé pour dédupliquer la variable PATH réelle qui avait déjà été définie, car je ne voulais pas modifier le script de base.
Vous pouvez toujours optimiser cela un peu plus, mais j'avais du code supplémentaire dans mon original pour afficher ce qui se passait pour s'assurer qu'il définissait correctement les variables. L'autre chose à noter est que j'exécute ce qui suit
C'est pour s'assurer que je peux gérer les répertoires avec des espaces (les répertoires de base Samba avec les noms d'utilisateurs Active Directory peuvent avoir des espaces!)
la source
/bin
s'il y a d'autres entrées comme/usr/bin
parce que l'expression rationnelle correspond même si les deux entrées ne sont pas identiques!Définissez votre chemin explicitement.
la source
PATH
n'est pas toujours la même.Une seule chaîne:
la source
$PATH
. J'aime mettre des répertoires spécifiques au début de$PATH
(comme/home/username
) pour que mes copies personnelles des exécutables soient exécutées au lieu des valeurs par défaut intégrées.Je peux penser à deux façons différentes de résoudre ce problème. La première consiste à démarrer votre .bashrc avec une ligne qui définit explicitement votre PATH de base, de cette façon chaque fois que vous le sourcez, il est réinitialisé à la base avant d'ajouter des répertoires supplémentaires.
Par exemple, ajoutez:
Vous pouvez également rechercher un élément avant de l'ajouter au chemin d'accès. Pour ce faire, vous utiliseriez quelque chose comme:
Ce dernier a tendance à devenir un peu répétitif si vous ajoutez beaucoup d'entrées, cependant, j'ai donc tendance à m'en tenir au premier. Si vous vouliez l'utiliser et prévoyiez d'ajouter beaucoup d'entrées, il serait sage d'écrire une fonction bash pour la gérer.
Remarque: La deuxième option peut uniquement fonctionner comme écrit dans les versions modernes bash. La prise en charge des expressions régulières n'est pas une fonctionnalité Bourne Shell (/ bin / sh) et peut ne pas exister dans d'autres shells. En outre, l'utilisation de guillemets peut ne pas être nécessaire ou peut même provoquer des problèmes sur certaines versions les plus récentes de bash.
la source
PATH
n'est pas toujours la même.if
. De plus, il est étonnamment (pour moi) facile d'en faire une fonction qui boucle sur des arguments séparés par des espaces, vous pouvez donc simplement dire:add_to_PATH ~/perl5/bin ~/.bin
unix.stackexchange.com/a/4973/28760 (je suppose que lacase
déclaration utilisée là-bas est plus portable , mais votreif
est plus clair pour moi). EDIT étrange coïncidence que cette question ajoute également perl5!Voici ma solution:
PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: '!x[$0]++' | sed "s/\(.*\).\{1\}/\1/")
Une belle doublure facile qui ne laisse pas de traces:
la source