Linux: Usuń nadmiarowe ścieżki ze zmiennej $ PATH
Linux From Scratch ma tę funkcję w / 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"
}
Ma to być używane z tymi funkcjami do dodawania do ścieżki, aby nie robić tego nadmiarowo:
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"
}
Prostym użyciem jest po prostu podanie pathremove
ścieżki katalogu do usunięcia - ale pamiętaj, że musi ona dokładnie pasować:
$ pathremove /home/username/anaconda3/bin
Spowoduje to usunięcie każdej instancji tego katalogu ze ścieżki.
Jeśli chcesz, aby katalog znajdował się w Twojej ścieżce, ale bez redundancji, możesz po prostu użyć jednej z pozostałych funkcji, np. - w swoim konkretnym przypadku:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Ale o ile czytelność nie jest problemem, w tym momencie lepiej po prostu zrobić:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Czy powyższe zadziałałoby we wszystkich powłokach znanych człowiekowi?
Chciałbym przypuszczać powyższego do pracy w sh
, dash
i bash
przynajmniej. Byłbym zaskoczony, gdyby się dowiedział, że to nie działa csh
, fish', or
ksh`. Wątpię, czy zadziałaby w powłoce poleceń Windows lub w Powershell.
Jeśli masz Pythona, poniższe polecenie powinno zrobić to, o co bezpośrednio zapytano (czyli usunąć nadmiarowe ścieżki):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Jednowierszowy (aby uniknąć problemów wielowierszowych):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Powyższe usuwa później zbędne ścieżki. Aby usunąć wcześniejsze nadmiarowe ścieżki, użyj indeksu odwróconej listy i ponownie go odwróć:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )