$PATH 中出现两次的目录

$PATH 中出现两次的目录

根据课程的建议,我在 .bashrc 中添加了以下行:

export PATH=/home/dodgycoder/kafka_2.12-2.3.1/bin:$PATH

现在,当我打开终端窗口时,这个目录会显示两次:

$ echo $PATH
/home/dodgycoder/kafka_2.12-2.3.1/bin:/home/dodgycoder/kafka_2.12-2.3.1/bin:/usr/local/bin:...

这是为什么?将目录添加到 PATH 的正确方法是什么?

我使用的是 Fedora 和 Gnome 桌面。我确认我只有上面的一行一次在我的 .bashrc 中并且它没有在其他任何地方定义。

答案1

这里的问题是您添加 PATH 组件的方式。

当您将目录添加到 PATH 时,它可能已经存在。在这种情况下有两个选项:1) 不再添加,或 2) 删除并添加它。

我使用(2),因为我更喜欢控制 PATH 中的目录顺序。

为了避免这个问题,我在 .bashrc 中使用了几个函数,它们允许在 PATH 的开头或结尾添加一个目录,并且只保留一次出现。

定义这些函数的方法可能是:

# _remove $1 from PATH
_path_del() {
    local _l=":$PATH:"
    while [[ $_l =~ :$1: ]]; do
          _l=${_l//:$1:/:}
    done
    _l=${_l%:}
    _l=${_l#:}
    PATH="$_l"
}

# _prepend : prepend $1 to PATH.
_path_prepend() {
    _path_del "$1"
    PATH="$1:$PATH"
}

# _append : append $1 to PATH.
_path_append() {
    _path_del "$1"
    PATH="$PATH:$1"
}

使用示例:

# possible initial PATH
PATH=/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

# append ~/bin if it exists
[[ -d "$HOME/bin" ]] && _path_append "$HOME/bin"
printf "%s\n" "$PATH"
# prepend ~/bin if it exists
[[ -d "$HOME/bin" ]] && _path_prepend "$HOME/bin"
printf "%s\n" "$PATH"

输出:

/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin:/home/br/bin
/home/br/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

编辑:如果您不关心 PATH 中新目录的顺序,并且更喜欢(稍微快一点的)解决方案(1),您可以尝试类似以下操作:

[[ :$PATH: =~ :$newpath: ]] || PATH="$newpath:$PATH"  # prepend
[[ :$PATH: =~ :$newpath: ]] || PATH="$PATH:$newpath"  # append

答案2

.bashrc不是设置$PATH或任何其他环境变量的最佳位置,因为它可能会被调用多次。

最好在 中设置环境变量~/.profile

请参阅以下帖子:

相关内容