Linux: 从$PATH变量中删除冗余路径
Linux From Scratch在/etc/profile中有这个功能
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
以上的方法是否适用于所有已知的shell?
我认为至少在sh
、dash
和bash
中可以使用上述方法。如果它不能在csh
、fish
或ksh
中使用,那么我会感到惊讶。我怀疑它无法在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)))
" )