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

时间:2013-09-05 21:03:20

标签: ruby rbenv

我可以使用本地和全局命令来改变我的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]

2 个答案:

答案 0 :(得分:4)

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中的。
  5. rbenv()函数由rbenv设置过程的eval "$(rbenv init -)"部分安装。 (您应该在.bashrc或类似的init脚本中包含该行。)此init步骤是可选的(rbenv将在没有它的情况下工作)但它确实为rbenv提供了tab-completion以及enable { {1}}此处描述的功能,以及可能存在的任何其他rbenv shell命令(例如插件提供的那些命令)。

答案 1 :(得分:0)

糟糕!看起来有些人口吃了。

$ 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