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
至少。得知它在ksh中不起作用csh
,我会感到惊讶fish', or
。我怀疑它是否可以在Windows命令shell或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)))
" )