Linux: Suppression des chemins redondants de la variable $ PATH

J’ai défini le même chemin dans la variable $ PATH 6 fois.

Je ne me déconnectais pas pour vérifier si cela fonctionnait.

Comment puis-je supprimer les doublons?

La variable $ PATH ressemble à ceci:

echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin 

Comment le réinitialiserais-je à

 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

Vous venez d’exécuter:

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

Ce serait pour la session en cours, si vous voulez changer de manière permanente, ajoutez-la à n’importe quel fichier .bashrc, bash.bashrc, / etc / profile – tout ce qui correspond à vos besoins système et utilisateur.

Si vous utilisez Bash, vous pouvez également procéder comme suit, disons, pour supprimer le répertoire /home/wrong/dir/ de votre variable PATH :

 PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'` 

Si vous devez supprimer un chemin de la variable PATH avant que votre script ne s’exécute, ajoutez-le au début du script:

 PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;') 

Si vous en avez besoin, vous pouvez le rappend en tête de liste avec:

 PATH=/home/user/bin:$PATH 

Ou vous pouvez le rappend à la fin de la liste avec:

 PATH=$PATH:/home/user/bin 

Voici un code de ligne qui nettoie le PATH

  • Cela ne perturbe pas l’ordre du PATH, il suffit de supprimer les doublons
  • Treats: et empord PATH gracieusement
  • Aucun caractère spécial utilisé, ne nécessite donc pas de fuite
  • Utilise /bin/awk donc ça marche même quand PATH est cassé

     export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";} {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1; printf(((NR==1)?"":":")$0)}}')"; 

Linux à partir de zéro a cette fonction dans / etc / profile

 # Functions to help us manage paths. Second argument is the name of the # path variable to be modified (default: PATH) pathremove () { local IFS=':' local NEWPATH local DIR local PATHVARIABLE=${2:-PATH} for DIR in ${!PATHVARIABLE} ; do if [ "$DIR" != "$1" ] ; then NEWPATH=${NEWPATH:+$NEWPATH:}$DIR fi done export $PATHVARIABLE="$NEWPATH" } 

Ceci est destiné à être utilisé avec ces fonctions pour append au chemin, afin de ne pas le faire de manière redondante:

 pathprepend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}" } pathappend () { pathremove $1 $2 local PATHVARIABLE=${2:-PATH} export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1" } 

L’utilisation simple consiste simplement à donner à pathremove le chemin de répertoire à supprimer – mais gardez à l’esprit qu’il doit correspondre exactement:

 $ pathremove /home/username/anaconda3/bin 

Cela supprimera chaque instance de ce répertoire de votre chemin.

Si vous voulez que le répertoire soit sur votre chemin, mais sans les redondances, vous pouvez simplement utiliser l’une des autres fonctions, par exemple – pour votre cas particulier:

 $ pathprepend /usr/local/sbin $ pathappend /usr/local/bin $ pathappend /usr/sbin $ pathappend /usr/bin $ pathappend /sbin $ pathappend /bin $ pathappend /usr/games 

Mais, à moins que la lisibilité ne soit un problème, à ce stade, il est préférable de ne faire que:

 $ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

En bash, vous pouvez simplement $ {var / find / replace}

 PATH=${PATH/%:\/home\/wrong\/dir\//} 

Ou dans ce cas (le bit de remplacement est vide) juste:

 PATH=${PATH%:\/home\/wrong\/dir\/} 

Je suis venu ici en premier mais je suis allé plus loin car je pensais qu’il y aurait une extension des parameters pour ce faire. Plus facile que sed !.

Comment remplacer le caractère réservé ou le mot dans la variable par la valeur d’une autre variable dans Bash?

Pour un modèle de copier-coller facile, j’utilise cet extrait de Perl:

 PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::` 

De cette façon, vous n’avez pas besoin d’échapper aux barres obliques pour l’opérateur de remplacement.

Si vous souhaitez simplement supprimer les chemins d’access en double, j’utilise ce script que j’ai écrit il y a quelque temps car j’avais des problèmes avec plusieurs chemins d’access à perl5 / bin:

 #!/bin/bash # # path-cleanup # # This must be run as "source path-cleanup" or ". path-cleanup" # so the current shell gets the changes. pathlist=`echo $PATH | sed 's/:/\n/g' | uniq` # echo "Starting PATH: $PATH" # echo "pathlist: $pathlist" unset PATH # echo "After unset, PATH: $PATH" for dir in $pathlist do if test -d $dir ; then if test -z $PATH; then PATH=$dir else PATH=$PATH:$dir fi fi done export PATH # echo "After loop, PATH: $PATH" 

Et je l’ai mis dans mon ~ / .profile à la fin. Comme j’utilise BASH presque exclusivement, je ne l’ai pas essayé dans d’autres shells.

En supposant que votre shell soit Bash, vous pouvez définir le chemin avec

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

mais comme Levon l’a dit dans une autre réponse, dès que vous aurez terminé le shell, les modifications auront disparu. Vous voulez probablement configurer votre PATH dans ~/.bash_profile ou ~/.bashrc .

Il n’y a pas d’outils standard pour “éditer” la valeur de $PATH (c’est-à-dire “append un dossier uniquement s’il n’existe pas déjà” ou “supprimer ce dossier”).

Pour vérifier quel serait le chemin lorsque vous vous connecterez la prochaine fois, utilisez telnet localhost (ou telnet 127.0.0.1 ). Il vous demandera alors votre nom d’utilisateur et votre mot de passe.

Cela vous donne un nouveau shell de connexion (c’est-à-dire un tout nouveau qui n’hérite de rien de l’environnement actuel).

Vous pouvez vérifier la valeur de $PATH et éditer vos fichiers rc jusqu’à ce qu’ils soient corrects. Ceci est également utile pour voir si vous pouvez vous connecter à nouveau après avoir modifié un fichier important.

Comment avez-vous ajouté ces chemins dupliqués à votre variable PATH? Vous devez avoir édité l’un de vos . des dossiers. ( .tcshrc ou .bashrc , etc. en fonction de votre système / shell particulier). La solution consiste à modifier le fichier à nouveau et à supprimer les chemins dupliqués.

Si vous n’avez modifié aucun fichier et que vous avez modifié le PATH de manière interactive. Dans ce cas, les modifications ne seront pas “collées”, c’est-à-dire que si vous ouvrez un autre shell, ou si vous vous déconnectez et vous reconnectez, les modifications seront automatiquement supprimées.

Notez qu’il y a aussi des fichiers de configuration système, mais il est peu probable que vous les ayez modifiés, donc vous changerez probablement de fichiers dans votre répertoire personnel (si vous voulez rendre ces modifications permanentes une fois que vous avez défini un ensemble de chemins)