如何处理PATH变量中的重复项?

时间:2017-05-28 21:04:32

标签: bash path

我最近将这一行添加到我的.bashrc文件中,以便我可以从命令行使用java编译器javac(如果有所不同,则使用MobaXTerm)

export PATH=$PATH:"/cygdrive/c/Program Files/Java/jdk1.8.0_101/bin"

但我在我的$PATH变量中看到多个重复项(请注意,仅为了可读性而添加换行符)

/bin:
/drives/c/Users/Justin/DOCUME~1/MobaXterm/slash/bin:
/drives/c/WINDOWS:
/drives/c/WINDOWS/system32:
/cygdrive/c/ProgramFiles/Java/jdk1.8.0_101/bin:
/cygdrive/c/ProgramFiles/Java/jdk1.8.0_101/bin:
/cygdrive/c/ProgramFiles/Java/jdk1.8.0_101/bin

我添加到$PATH的方式有什么问题吗?

2 个答案:

答案 0 :(得分:3)

如果PATH由.bashrc调用的不同脚本操纵,通常就是结果。

虽然PATH中的重复项不是主要问题,但有两种方法可以使PATH不受其影响:

  1. 在添加
  2. 之前检查PATH中是否已存在目录
  3. Dedupe PATH是.bashrc
  4. 的最后一步

    添加前检查

    javabin="/cygdrive/c/ProgramFiles/Java/jdk1.8.0_101/bin"
    if ! [[ $PATH =~ "$javabin" ]]; then
      PATH="$PATH:$javabin"
    fi
    

    或写一个函数:

    add_to_path() {
        local dir re
    
        for dir; do
            re="(^$dir:|:$dir:|:$dir$)"
            if ! [[ $PATH =~ $re ]]; then
                PATH="$PATH:$dir"
            fi
        done
    }
    
    add_to_path "/cygdrive/c/ProgramFiles/Java/jdk1.8.0_101/bin"
    

    重复数据删除(我在SO上找到的最佳方法)

    PATH="$(perl -e 'print join(":", grep { not $seen{$_}++ } split(/:/, $ENV{PATH}))')"
    

    另见Unix和& Linux / SuperUser StackExchange:

答案 1 :(得分:0)

在/ etc / profile中定义了一个名为pathmunge的函数:

pathmunge () {
    case ":${PATH}:" in
        *:"$1":*)
            ;;
        *)
            if [ "$2" = "after" ] ; then
                PATH=$PATH:$1
            else
                PATH=$1:$PATH
            fi
    esac
}

不幸的是,它在文件末尾也没有设置。但是,只需删除未设置的行,就可以在.bashrc文件中使用它。