Voici un code d'une ligne qui nettoie le PATH
- Cela ne perturbe pas l'ordre du PATH, supprime simplement les doublons
- Traite :et empth PATH gracieusement
- Aucun caractère spécial n'est utilisé, donc ne nécessite pas d'échappement
-
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)}}')";
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 souhaitez le modifier de manière permanente, ajoutez-le à n'importe quel .bashrc, bash.bashrc, /etc/profile - tout ce qui correspond à votre système et aux besoins de l'utilisateur.
Remarque :Ceci est pour Linux. Nous clarifierons cela pour les nouveaux codeurs. (` , ') N'essayez pas de SET =ceux-ci.
Linux :supprimer les chemins redondants de la variable $PATH
Linux From Scratch 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 ajouter au chemin, afin que vous ne le fassiez pas 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"
}
Une utilisation simple consiste à donner simplement pathremove
le chemin du 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 le répertoire dans votre chemin, mais sans les redondances, vous pouvez simplement utiliser l'une des autres fonctions, par ex. - 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 la préoccupation, à ce stade, vous feriez mieux de simplement faire :
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Est-ce que ce qui précède fonctionnerait dans tous les obus connus de l'homme ?
Je suppose que ce qui précède fonctionne dans sh
, dash
, et bash
au moins. Je serais surpris d'apprendre que cela ne fonctionne pas en csh
, fish', or
ksh`. Je doute que cela fonctionne dans le shell de commande Windows ou Powershell.
Si vous avez Python, le type de commande suivant devrait faire ce qui est directement demandé (c'est-à-dire supprimer les chemins redondants) :
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Une ligne (pour éviter les problèmes multilignes) :
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Ce qui précède supprime les chemins redondants ultérieurs. Pour supprimer les anciens chemins redondants, utilisez l'index d'une liste inversée et inversez-le à nouveau :
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )
Si vous utilisez Bash, vous pouvez également effectuer les opérations suivantes si, disons, vous souhaitez supprimer le répertoire /home/wrong/dir/
depuis votre PATH
variables :
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`