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 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 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 exemple - pour votre cas spécifique:
$ 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 le problème, à 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 toutes les coquilles connues de l'homme?
Je présume ci - dessus au travail sh
, dash
et bash
au moins. Je serais surpris d'apprendre que cela ne fonctionne pas dans 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 unique (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 chemins redondants antérieurs, 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)))
" )