【问题标题】:pyenv initialization in .bash_profile vs. .bashrc (after release 2.0.0).bash_profile 与 .bashrc 中的 pyenv 初始化(2.0.0 版之后)
【发布时间】:2021-05-28 21:14:30
【问题描述】:

随着最近发布的 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 上,使用 Homebrew 安装 pyenv,以及使用 venv 创建的 Python 3.6/3.7/3.8 虚拟环境)。我试图了解以这种方式配置我的系统可能存在哪些缺点,以及为什么文档对同时使用 .bash_profile 和 .bashrc 如此重要。

这样配置pyenv以后会不会给我带来麻烦?

【问题讨论】:

    标签: bash documentation pyenv


    【解决方案1】:

    Bash only runs ~/.bash_profile when you start a login shell。当您通过键入bashexec bash 启动一个新shell 时,它只运行~/.bashrc。但是,您可以通过始终使用 bash -lexec 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 shellpyenv rehash 只是有一些特殊的包装。

    所以,只要您不为pyenv 使用制表符完成,也不在非登录shell 中使用命令pyenv shellpyenv rehash,那么它应该没有区别。但即使您确实想在那里使用它们,您也可以简单地使用 bash -l 启动 shell 或手动运行 eval "$(pyenv init -)"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 2017-06-22
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多