141

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

12 回答 12

130

你只需执行:

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

这将适用于当前会话,如果您想永久更改,请将其添加到任何 .bashrc、bash.bashrc、/etc/profile - 适合您的系统和用户需要的任何内容。

注意:这是针对 Linux 的。我们将为新编码人员明确这一点。(` , ') 不要尝试 SET = 这些。

于 2012-07-25T13:37:24.543 回答
75

如果您使用的是 Bash,如果您想/home/wrong/dir/PATH变量中删除目录,还可以执行以下操作:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
于 2013-09-20T20:58:07.337 回答
19

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)))
" )
于 2017-11-07T13:57:55.883 回答
11

这是清理 PATH 的一行代码

  • 它不会扰乱 PATH 的顺序,只是删除重复项
  • 对待 : 并优雅地清空 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)}}')";
    
于 2012-08-13T01:50:03.480 回答
3

如果您只想删除任何重复的路径,我会使用我不久前写的这个脚本,因为我遇到了多个 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 中尝试过。

于 2018-07-07T23:32:47.963 回答
3
  1. 只是echo $PATH
  2. 将详细信息复制到文本编辑器中
  3. 删除不需要的条目
  4. PATH= # pass new list of entries
于 2019-03-05T07:45:01.067 回答
2

在 bash 中,您只需 ${var/find/replace}

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

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

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

我首先来到这里,但因为我认为会有一个参数扩展来做到这一点,所以我去了其他地方。比 sed 容易!

如何用 Bash 中另一个变量的值替换变量中的占位符或单词?

于 2015-06-10T13:59:20.093 回答
1

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

如果您没有编辑任何文件,并且您必须以交互方式修改 PATH。在这种情况下,更改不会“坚持”,即如果您打开另一个 shell,或者注销并重新登录,更改将自动消失。

请注意,也有一些系统范围的配置文件,但您不太可能修改这些文件,因此很可能您将更改个人主目录中的文件(如果您希望在确定一组路径后永久更改这些文件)

于 2012-07-25T13:33:26.043 回答
0

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

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

但就像 Levon 在另一个答案中所说的那样,一旦您终止 shell,更改就会消失。您可能想要设置您的PATHin~/.bash_profile~/.bashrc.

于 2012-07-25T13:38:31.947 回答
0

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

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

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

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

于 2012-07-25T13:40:42.647 回答
0

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

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

这样您就不需要为替代运算符转义斜线。

于 2017-02-15T22:18:07.550 回答
-1

路径=echo $PATH | sed 's/:/\n/g' | sort -u | sed ':a;N;$!ba;s/\n/:/g'

于 2020-09-29T04:29:10.773 回答