从$ PATH变量中删除冗余路径

问题描述 投票:111回答:12

我在$ 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
linux bash path environment-variables sh
12个回答
111
投票

你只需执行:

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

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


0
投票

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

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

但是像Levon在另一个回答中所说,一旦你终止shell,变化就会消失。你可能想在PATH~/.bash_profile设置你的~/.bashrc


0
投票

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

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

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

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


0
投票

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

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

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


63
投票

如果您正在使用Bash,那么如果您想要从/home/wrong/dir/变量中删除目录PATH,也可以执行以下操作:

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

14
投票

如果需要在脚本运行之前从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

10
投票

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

上述工作是否适用于人类已知的所有壳体?

我认为上面至少可以在shdashbash工作。我会惊讶地发现它在cshfish', orksh`中不起作用。我怀疑它在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)))
" )

7
投票

这是一个清除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)}}')";

2
投票

在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?


2
投票

如果你只是想删除任何重复的路径,我使用这个脚本我写了一段时间,因为我遇到了多个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中尝试过。


1
投票

对于简单的复制粘贴模板,我使用此Perl代码段:

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

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


1
投票
  1. 只是echo $PATH
  2. 将详细信息复制到文本编辑器中
  3. 删除不需要的条目
  4. PATH= # pass new list of entries
© www.soinside.com 2019 - 2024. All rights reserved.