我在$ 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/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
你只需执行:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
这将是当前会话,如果你想永久改变它添加到任何.bashrc,bash.bashrc,/ etc / profile - 任何适合您的系统和用户需求。
假设你的shell是Bash,你可以设置路径
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
但是像Levon在另一个回答中所说,一旦你终止shell,变化就会消失。你可能想在PATH
或~/.bash_profile
设置你的~/.bashrc
。
没有标准工具来“编辑”$PATH
的值(即“仅当文件夹尚不存在时添加文件夹”或“删除此文件夹”)。
要查看下次登录时的路径,请使用telnet localhost
(或telnet 127.0.0.1
)。然后它会询问您的用户名和密码。
这为您提供了一个新的登录shell(即一个不会从当前环境继承任何内容的全新登录shell)。
您可以在那里检查$PATH
的值并编辑您的rc文件,直到它正确为止。这对于在更改重要文件后是否可以再次登录也很有用。
你是如何将这些重复路径添加到PATH变量的?您必须编辑了一个.
文件。 (.tcshrc
,或.bashrc
等,具体取决于您的特定系统/ shell)。修复它的方法是再次编辑文件并删除重复的路径。
如果您没有编辑任何文件,那么您必须以交互方式修改PATH。在这种情况下,更改不会“粘住”,即如果您打开另一个shell,或者注销并重新登录,更改将自动消失。
请注意,也有一些系统范围的配置文件,但您不太可能修改它们,因此很可能您将更改个人主目录中的文件(如果您希望在您确定一组路径后将这些更改永久保留)
如果您正在使用Bash,那么如果您想要从/home/wrong/dir/
变量中删除目录PATH
,也可以执行以下操作:
PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
如果需要在脚本运行之前从PATH
变量中删除路径,请将其添加到脚本的开头:
PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')
如果需要,可以在列表的前面重新添加:
PATH=/home/user/bin:$PATH
或者您可以在列表末尾重新添加它:
PATH=$PATH:/home/user/bin
Linux:从$ PATH变量中删除冗余路径
Linux From Scratch有这个function in /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
ksh`中不起作用。我怀疑它在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)))
" )
这是一个清除PATH的单行代码
/bin/awk
,即使PATH坏了也能正常工作
export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
{sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
printf(((NR==1)?"":":")$0)}}')";
在bash你只需$ {var / find / replace}
PATH=${PATH/%:\/home\/wrong\/dir\//}
或者在这种情况下(因为替换位为空)只是:
PATH=${PATH%:\/home\/wrong\/dir\/}
我第一次来到这里,但是因为我认为会有一个parameter expansion来做这件事。比sed更容易!
How to replace placeholder character or word in variable with value from another variable in Bash?
如果你只是想删除任何重复的路径,我使用这个脚本我写了一段时间,因为我遇到了多个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"
我最后把它放在我的〜/ .profile中。由于我几乎完全使用BASH,我没有在其他shell中尝试过。
对于简单的复制粘贴模板,我使用此Perl代码段:
PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::`
这样您就不需要为替换运算符转义斜杠。
echo $PATH
PATH= # pass new list of entries