Linux: удалить избыточные пути из переменной $ PATH
Linux From Scratch имеет эту функцию в / 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"
}
Это предназначено для использования с этими функциями для добавления к пути, чтобы вы не делали это повторно:
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"
}
Простое использование - просто указать pathremove
путь к каталогу для удаления, но имейте в виду, что он должен точно совпадать:
$ pathremove /home/username/anaconda3/bin
Это удалит каждый экземпляр этого каталога из вашего пути.
Если вам нужен каталог на вашем пути, но без дублирования, вы можете просто использовать одну из других функций, например - для вашего конкретного случая:
$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games
Но, если удобочитаемость не является проблемой, на этом этапе вам лучше просто сделать:
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Будет ли это работать во всех известных человеку оболочках?
Я полагаю , выше , чтобы работать в sh
, dash
и , по bash
крайней мере. Я был бы удивлен, узнав, что это не работает csh
, fish', or
кш. Я сомневаюсь, что это будет работать в командной оболочке Windows или Powershell.
Если у вас есть Python, следующая команда должна делать то, что вам прямо запрошено (то есть удалять избыточные пути):
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )
Однострочный (чтобы обойти многострочные проблемы):
$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )
Вышесказанное удаляет более поздние избыточные пути. Чтобы удалить более ранние избыточные пути, используйте индекс перевернутого списка и снова переверните его:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )