如何解决.bash_profile 与 .bashrc 中的 pyenv 初始化2.0.0 版之后
随着最近发布的 pyenv 2.0.0,documentation 目前推荐以下配置用于 bash shell:
# inside ~/.bash_profile
eval "$(pyenv init --path)"
# inside ~/.bashrc
eval "$(pyenv init -)"
如果我不允许在我的系统上编辑 .bashrc(出于与 pyenv 完全无关的原因),那么将两者都放在我的个人资料中会有什么缺点,如下所示:
# inside ~/.bash_profile
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
我已经像这样使用它几个小时了,我没有注意到任何问题(在 MacOS 上,使用 pyenv 的 Homebrew 安装,以及使用 venv 创建的 Python 3.6/3.7/3.8 虚拟环境)。我试图了解以这种方式配置我的系统可能有什么缺点,以及为什么文档对同时使用 .bash_profile 和 .bashrc 如此重要。
这样配置pyenv以后会不会给我带来问题?
解决方法
Bash only runs ~/.bash_profile
when you start a login shell。当您通过键入 bash
或 exec bash
启动一个新 shell 时,它只会运行 ~/.bashrc
。但是,您可以通过始终使用 bash -l
或 exec bash -l
启动新 shell 来轻松解决此问题,这将使新 shell 成为登录 shell。
要了解是否在非登录 shell 中运行 eval "$(pyenv init -)"
是否有所不同,让我们来看看 pyenv init -
的真正作用:
$ pyenv init -
export PYENV_SHELL=bash
source '/usr/local/Cellar/pyenv/2.0.0/libexec/../completions/pyenv.bash'
command pyenv rehash 2>/dev/null
pyenv() {
local command
command="${1:-}"
if [ "$#" -gt 0 ]; then
shift
fi
case "$command" in
rehash|shell)
eval "$(pyenv "sh-$command" "$@")"
;;
*)
command pyenv "$command" "$@"
;;
esac
}
由于 export PYENV_SHELL=bash
将 $PYENV_SHELL
放入环境中,因此您的非登录 shell 也会导入它。所以,这没有任何区别。
至于其余部分,您似乎错过的主要内容是 pyenv
的命令行补全。除此之外,还有一些特殊的 pyenv shell
和 pyenv rehash
包装。
因此,只要您不为 pyenv
使用制表符补全,也不在非登录 shell 中使用命令 pyenv shell
和 pyenv rehash
,那么它应该没有区别。但即使您确实想在那里使用它们,您也可以简单地使用 bash -l
启动 shell 或手动运行 eval "$(pyenv init -)"
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。