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

时间:2012-07-25 13:29:22

标签: linux bash path environment-variables sh

我在$ 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

13 个答案:

答案 0 :(得分:107)

您只需执行:

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

适用于当前会话,如果您想要永久更改,请将其添加到任何.bashrc,bash.bashrc,/ etc / profile - 无论您的系统和用户需求是什么。

答案 1 :(得分:62)

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

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

答案 2 :(得分: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

答案 3 :(得分: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', 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)))
" )

答案 4 :(得分: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)}}')";
    

答案 5 :(得分: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?

答案 6 :(得分:2)

如果您只想删除任何重复的路径,我会使用一段时间后写的这个脚本,因为我在使用多个perl5 / bin路径时遇到了麻烦:

\0

最后我将它放在我的〜/ .profile中。由于我几乎只使用BASH,所以我没有在其他Shell中尝试过。

答案 7 :(得分:1)

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

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

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

答案 8 :(得分:1)

  1. echo $PATH
  2. 将详细信息复制到文本编辑器中
  3. 删除不需要的条目
  4. PATH= # pass new list of entries

答案 9 :(得分:0)

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

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

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

答案 10 :(得分: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

答案 11 :(得分:0)

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

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

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

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

答案 12 :(得分:0)

PATH = int input; std::cin >> input; if ("max" > input && input > "min") { //what you want to do } else{ //error handling }