取下$ PATH变量的冗余路径(Remove redundant paths from $PATH

2019-06-26 13:11发布

我已经定义在$ 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

Answer 1:

您只需执行:

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

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



Answer 2:

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

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


Answer 3:

如果您需要从删除路径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


Answer 4:

Linux的:删除$ PATH变量的冗余路径

从头Linux有这个在/ 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

就已知的所有炮弹上面工作的人吗?

我敢在工作上面shdashbash至少。 我会很惊讶地得知它不工作cshfish', or 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)))
" )


Answer 5:

下面是清理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)}}')"; 


Answer 6:

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

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

或者,在这种情况下(如替换位是空的)只是:

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

我来这里是第一,但去其他洁具,因为我以为会有一个参数展开做到这一点。 更容易比sed的!

如何从猛砸另一个变量与值替换占位符或文字的变量?



Answer 7:

如果你只是想删除任何重复的路,我用这个剧本我写了一段时间后,因为我是在以多的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几乎完全,我还没有在其他炮弹尝试过。



Answer 8:

对于一个简单的复制粘贴模板,我用这个Perl的片段:

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

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



Answer 9:

  1. 只是echo $PATH
  2. 细节复制到一个文本编辑器
  3. 删除不需要的条目
  4. PATH= # pass new list of entries


Answer 10:

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

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

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



Answer 11:

有没有标准的工具,“编辑”的价值$PATH (即“添加文件夹,只有当它不已经存在”或“删除此文件夹”)。

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

这给你一个新的登录shell(即一个完全新的,不从当前环境继承任何东西)。

您可以检查的价值$PATH那里,编辑您的rc文件,直到它是正确的。 这也是有用的,看看你是否能再次在所有作出改变的重要文件后登录。



Answer 12:

你是如何添加到您的PATH变量这些重复的路径? 你必须编辑你的一个. 文件。 ( .tcshrc ,或.bashrc ,等这取决于您的特定系统/壳)。 解决它的方法是重新编辑该文件并删除重复的路径。

如果没有编辑任何文件,你必须以交互方式修改的路径。 在这种情况下,变化不会“大棒”,也就是说,如果你打开另一个shell,或注销并重新登录,更改将自动消失。

请注意,有一些系统范围的配置文件了,但它不太可能你修改过的,所以很有可能你会在你的个人主页目录修改文件(如果你想使这些更改永久,一旦你看中一组路径)



文章来源: Remove redundant paths from $PATH variable