Linux: Entfernen Sie redundante Pfade aus der Variablen $ PATH
Linux From Scratch hat diese Funktion in / 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"
}
Dies soll mit diesen Funktionen zum Hinzufügen zum Pfad verwendet werden, damit Sie dies nicht redundant tun:
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"
}
Die einfache Verwendung besteht darin, nur pathremove
den zu entfernenden Verzeichnispfad anzugeben. Beachten Sie jedoch, dass dieser genau übereinstimmen muss:
$ pathremove /home/username/anaconda3/bin
Dadurch wird jede Instanz dieses Verzeichnisses aus Ihrem Pfad entfernt.
Wenn Sie das Verzeichnis in Ihrem Pfad haben möchten, aber ohne Redundanzen, können Sie einfach eine der anderen Funktionen verwenden, z. B. - für Ihren speziellen Fall:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Aber wenn es nicht um Lesbarkeit geht, ist es an dieser Stelle besser, nur Folgendes zu tun:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Würde das oben genannte in allen dem Menschen bekannten Schalen funktionieren?
Ich würde das oben zur Arbeit in anmaßen sh
, dash
und bash
zumindest. Ich wäre überrascht zu erfahren, dass es nicht funktioniert csh
, fish', or
ksh`. Ich bezweifle, dass es in Windows Command Shell oder Powershell funktionieren würde.
Wenn Sie über Python verfügen, sollte der folgende Befehl die direkt angeforderten Anweisungen ausführen (dh redundante Pfade entfernen):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Ein Einzeiler (um mehrzeilige Probleme zu umgehen):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Das Obige entfernt später redundante Pfade. Um frühere redundante Pfade zu entfernen, verwenden Sie den Index einer umgekehrten Liste und kehren Sie ihn erneut um:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )