2012-07-25 151 views
90

我已经在$ 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 
+0

哪儿去定义它的6倍?在哪些文件? – hovanessyan 2012-07-25 14:06:12

+3

可能重复[在Bash中从$ PATH变量中删除路径的最优雅方式是什么?](http://stackoverflow.com/questions/370047/what-is-the-most-elegant-way-to -remove-a-path-from-the-path-variable-in-bash) – 2014-10-17 12:30:32

回答

88

您只需要执行:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

这将是当前会话中,如果你想改变永久将其添加到任何的.bashrc,bash.bashrc,/ etc/profile文件 - 无论符合您的系统和用户需求。

+0

是的,我将它们永久地设置在bash.bashrc中。那么命令应该是这样的吗? 'echo'export PATH = $ PATH:/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:/ usr/games'>>〜/ .bashrc ' – 2012-07-25 13:44:30

+0

的事情是,取决于你的操作系统的配置链执行。您需要确保PATH变量稍后不会被覆盖。最简单的方法(对于一个用户)是将其覆盖在用户的个人.bashrc中,该用户通常位于其主目录中。 – hovanessyan 2012-07-25 13:46:05

+0

您的命令将PATH设置为 - $ PATH(PATH的当前值)+字符串/ usr/local/sbin:/ usr/local/bin:/ usr/sbin:/ usr/bin:/ sbin:/ bin:的/ usr/GAM ES。如果你想只有字符串,请从命令中删除$ PATH +分号(:)。手动使用echo或编辑文件〜/ .bashrc无关紧要。 – hovanessyan 2012-07-25 13:47:25

0

你怎么这些重复的路径添加到您的PATH变量?您必须编辑您的.文件之一。 (.tcshrc.bashrc等,具体取决于您的特定系统/外壳)。修复它的方法是再次编辑文件并删除重复的路径。

如果你没有编辑任何文件,而你你必须已经交互地修改了PATH。在这种情况下,更改不会“粘住”,即如果您打开另一个shell,或者注销并重新登录,更改将自动消失。

请注意,也有一些系统配置文件,但它不太可能你修改这些,所以很可能你会改变你的个人主目录中的文件(如果你想让这些更改永久解决组路径)

0

假设你的shell是bash,你可以设置路径与

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 

但像捷尔另一种回答说,只要你终止Shell的变化将会消失。您可能想要在~/.bash_profile~/.bashrc中设置您的PATH

0

没有标准的工具来编辑$PATH的值(即“仅在文件夹不存在时才添加文件夹”或“删除此文件夹”)。

要检查下次登录时的路径,请使用telnet localhost(或telnet 127.0.0.1)。然后它会询问您的用户名和密码。

这为您提供了一个新的登录shell(即一个不会从当前环境继承任何东西的全新登录shell)。

你可以检查那里的$PATH的值,并编辑你的rc文件,直到它是正确的。这对查看是否可以在对重要文件进行更改后再次登录也很有用。

+0

只需键入'/ bin/bash -i',而不必输入用户名/密码。更少麻烦。 – 2012-07-25 13:47:07

7

下面是一行代码,清理PATH

  • 它不会干扰路径的顺序,只需删除重复
  • 治疗:使用和empth PATH优雅
  • 没有特殊字符,所以不需要逃避
  • 用途/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)}}')"; 
    
57

如果你正在使用bash,你也可以做,如果下面,让我们说,你想从你的PATH变量删除目录/home/wrong/dir/

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'` 
+1

这对我很有用,因为/ etc/profile中添加了一个目录,我希望将其排除在外,但对/ etc没有写入权限。感谢:) – Samizdis 2014-04-23 15:42:42

+10

Protip:你可以在sed表达式中使用不同的deliminator来避免\/escaping:'PATH = $(echo $ PATH | sed -e's |:/ home/wrong/dir | $ ||') ' – iNecas 2014-12-11 21:30:27

+3

这个技巧有助于我想要立即拥有新的PATH,并且不想从当前终端注销。但是,为了避免混乱,在分配给PATH生成命令之前(例如'echo $ PATH | sed -e's /:\/home \/wrong \/dir \/$ //'')路径。 – biocyberman 2015-05-01 08:38:32

10

如果您需要删除的路径从你的脚本之前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 
+0

这对我有用。 – jessiPP 2017-08-12 08:11:23

1

在bash你根本就$ {VAR /查找/替换}

PATH=${PATH/%:\/home\/wrong\/dir\//} 

还是在这种情况下(作为替换位是空的)只是:

PATH=${PATH%:\/home\/wrong\/dir\/} 

我来到这里先,但去el因为我认为会有parameter expansion这样做。比sed更容易!

How to replace placeholder character or word in variable with value from another variable in Bash?

+0

'%'表示匹配字符串结尾,'#'表示开头。 – sabgenton 2015-06-10 14:35:04

1

为便于复制粘贴模板,我用这个Perl的片段:

PATH=`echo $PATH | perl -pe s:/path/to/be/excluded::` 

这样,你不需要逃避替代运营商的斜线。

3

Linux的从头开始有这个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