从系统和"shell"命令使用 rbenv 更改 Ruby 版本不起作用



我可以使用本地和全局命令简单地更改我的 rbenv,但我的 Ruby 版本并没有从根本上改变。 我的 shell 命令无法识别,但本地和全局可以识别。 我以前有RVM,但已卸载(据我所知)。 我该怎么办?

$ rbenv versions
  system
* 1.9.3-p0 (set by /Users/geoffreylord/.rbenv/version)
  2.0.0-p247
$ rbenv local
rbenv: no local version configured for this directory
$ rbenv global
1.9.3-p0
$ rbenv shell
rbenv: no such command `shell'
$ ruby -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

rbenv 的shell command之所以在磁盘上被称为rbenv-sh-shell shell是因为它是一种特殊类型的命令,其输出将在用户的当前交互式 shell 中评估。这使得此命令可以更改 shell 中的环境变量,否则仅通过执行命令无法做到这一点。

为了使rbenv-sh-*命令正常工作,rbenv 通过定义 rbenv() shell 函数来做一些黑客操作,该函数正常执行所有 rbenv 命令,并且 eval 是sh-*命令的输出。因此,当您运行rbenv shell 2.0时发生的情况是:

  1. rbenv() shell 函数被调用;
  2. 该函数执行rbenv sh-shell 2.0 ;
  3. sh-shell输出export RBENV_VERSION=2.0;
  4. rbenv()函数 eval 在您当前的交互式 shell 中。

rbenv()功能由 rbenv 设置过程的eval "$(rbenv init -)"部分安装。(您应该在.bashrc或类似的初始化脚本中包含该行。这个init步骤是可选的(rbenv 可以在没有它的情况下工作),但它确实为您提供了 rbenv 的制表符补全,并启用了此处描述的rbenv shell功能,以及可能存在的任何其他sh-*命令(例如插件提供的命令)。

哎呀!好像有人结结巴巴了。

$ ls $HOME/.rbenv/libexec/*shell*
/home/tim/.rbenv/libexec/rbenv-sh-shell

看起来没有 shell 命令,而是一个 sh-shell 命令

$ rbenv sh-shell
rbenv: no shell-specific version configured

是的。让我们看看,如果我们使用 rbenv-shell 链接到它

$ cd $HOME/.rbenv/libexec/
$ ln -s rbenv-sh-shell rbenv-shell

那么我们应该得到一个有效的 shell 命令

$ rbenv shell
rbenv: no shell-specific version configured

最新更新