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)))
" )