Linux 从$PATH变量中删除冗余路径
我在$path变量中定义了相同的路径6次 我登出不是为了检查它是否有效 如何删除重复项 $PATH变量如下所示:Linux 从$PATH变量中删除冗余路径,linux,bash,path,environment-variables,sh,Linux,Bash,Path,Environment Variables,Sh,我在$path变量中定义了相同的路径6次 我登出不是为了检查它是否有效 如何删除重复项 $PATH变量如下所示: echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flac
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin
我如何将其重置为
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
如何将这些重复路径添加到PATH变量中?您必须编辑了一个
文件。(.tcshrc
或.bashrc
等,具体取决于您的特定系统/外壳)。解决方法是再次编辑文件并删除重复路径
如果未编辑任何文件,则必须以交互方式修改路径。在这种情况下,更改不会“粘住”,即如果打开另一个shell,或注销并重新登录,更改将自动消失
请注意,也有一些系统范围的配置文件,但您不太可能修改这些文件,因此很可能您将更改个人主目录中的文件(如果您希望在确定一组路径后使这些更改永久化)您只需执行:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
如果您想永久性地更改当前会话,请将其添加到any.bashrc、bash.bashrc、/etc/profile中—任何适合您的系统和用户需要的内容
注意:这是针对Linux的。我们将向新的编码人员说明这一点。(`,')不要试图设置=这些。假设您的shell是Bash,您可以使用
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
但正如列文在另一个回答中所说,一旦你终止外壳,改变就会消失。您可能想在
~/.bash_profile
或~/.bashrc
中设置路径
。没有标准工具可以“编辑”$PATH
的值(即“仅当文件夹不存在时添加文件夹”或“删除此文件夹”)
要检查下次登录时的路径,请使用telnet localhost
(或telnet 127.0.0.1
)。然后它会询问您的用户名和密码
这将为您提供一个新的登录shell(即,一个不从当前环境继承任何内容的全新shell)
您可以在那里检查$PATH
的值,并编辑rc文件,直到其正确为止。这对于查看在更改重要文件后是否可以再次登录也很有用。下面是一个清理路径的单行代码
- 它不会干扰路径的顺序,只会删除重复项
- 款待:优雅地清空路径
- 没有使用特殊字符,因此不需要转义
- 使用
/bin/awk
,因此即使路径中断,它也能工作
export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
{sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
printf(((NR==1)?"":":")$0)}}')";
如果您使用的是Bash,如果您想从路径
变量中删除目录/home/error/dir/
,也可以执行以下操作:
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
在bash中,您只需${var/find/replace}
PATH=${PATH/%:\/home\/wrong\/dir\//}
或者在这种情况下(替换位为空),只需:
我先来这里,但去了其他地方,因为我认为会有一个新的方法来做这件事。比sed!容易
对于简单的复制粘贴模板,我使用以下Perl代码段:
PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`
这样,您就不需要为替换操作符跳过斜杠
Linux:从$PATH变量中删除冗余路径
Linux从头开始就有这样的功能
这将与这些函数一起用于添加到路径,这样您就不会冗余地执行此操作:
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'或
ksh`中不起作用。我怀疑它能否在Windows命令shell或Powershell中工作
如果您使用Python,则以下命令应执行直接请求的操作(即删除冗余路径):
一行程序(避开多行问题):
上述操作将删除以后的冗余路径。若要删除以前的冗余路径,请使用已反转列表的索引,然后再次将其反转:
$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )
如果您只想删除任何重复的路径,我将使用我不久前编写的脚本,因为我在使用多个perl5/bin路径时遇到问题:
#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current shell gets the changes.
pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`
# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
if test -d $dir ; then
if test -z $PATH; then
PATH=$dir
else
PATH=$PATH:$dir
fi
fi
done
export PATH
# echo "After loop, PATH: $PATH"
最后我把它放在我的~/.个人资料中。因为我几乎只使用BASH,所以我没有在其他shell中尝试过它
只需echo$PATH
将详细信息复制到文本编辑器中
删除不需要的条目
PATH=#传递新条目列表
PATH=echo$PATH | sed's/:/\n/g'| sort-u | sed':a;N、 美元!文学士;s/\n/:/g'
是的,我在bash.bashrc中永久设置了它们。那么命令应该是这样的吗echo'export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/games'>>~/.bashrc
问题在于,根据您的操作系统,会执行一系列配置。您需要确保以后不会覆盖PATH变量。(对于一个用户)最简单的方法是在用户的personal.bashrc中覆盖它,它通常位于用户的主目录中。您的命令将路径设置为-$PATH(PATH的当前值)+字符串/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/usr/gam锿。如果只需要字符串,请从命令中删除$PATH+分号(:)。无论您是使用echo还是手工编辑文件~/.bashrc,都无关紧要。bash.bashrc文件位于/etc文件夹中。但它不显示$PATH变量,因此我不确定在您的第一条评论中编辑它的位置
$ 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)))
" )
#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current shell gets the changes.
pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`
# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
if test -d $dir ; then
if test -z $PATH; then
PATH=$dir
else
PATH=$PATH:$dir
fi
fi
done
export PATH
# echo "After loop, PATH: $PATH"