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

标签 linux bash shell unix 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 的方式有问题吗?

最佳答案

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

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

  1. 在添加之前检查一个目录是否已经存在于 PATH 中
  2. 在你的 .bashrc 中的最后一步去重 PATH>

添加前检查

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"

Dedupe(我在SO上找到的最好的方法)

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

另见 Unix & Linux/SuperUser StackExchange:

关于linux - 如何处理我的 PATH 变量中的重复项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44232009/

相关文章:

bash -/dev/dsp在Debian中丢失,无法听到节日讲话

bash - 是否可以列出与 ls 模式匹配的文件?

python - 我们应该为一群DBA采用哪种跨平台脚本语言?

linux - 安装 DSPACE6 - mirage2 本地自定义失败

linux - 如何使用 linux 命令从另一个文件创建一个只包含小写字母的新文件?

python - 计算消息之间的时间 CANBUS

linux - 如果 SSH 中的任何命令返回非零值,如何退出 shell 脚本

python - Django最佳实践中执行os和子进程

git stderr 输出无法通过管道传输

shell - 在 sed/shell 中转义 < 和 >