根据课程的建议,我在 .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
。
请参阅以下帖子: