RVM安装不起作用: "RVM不是一个函数"

242

我刚安装了RVM,但无法使其工作。我在我的.profile文件的末尾有这样一行代码:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm"

我尝试运行source .profile并重新启动终端,但是当我运行rvm use 1.9.2时仍然出现以下情况:

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

我的系统是Ubuntu 11.10。

22个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
454

您需要运行以下代码

$ source ~/.rvm/scripts/rvm

然后运行这个

$ type rvm | head -n 1

如果你得到了

rvm is a function

问题已解决。

你还需要运行user$ rvm requirements以查看操作系统的依赖要求。

来源:https://rvm.io/rvm/install/

我忘了提到你需要把这个代码放到你的~/.bashrc或~/.zshrc文件中,这样你就不需要再次编写这个代码了。


2
谢谢。在我的Ubuntu 10.04上有效。 - vekozlov
20
这个解决方案仅在当前的Shell会话中有效。如果你采用这个方案,每次重新登录控制台时都必须重复这些步骤。更加永久的解决方案是将以下内容添加到/.bashrc文件中:如果存在/.rvm/scripts/rvm,则执行如下操作:[ "$(type -t rvm)" = "function" ] || source ~/.rvm/scripts/rvm。 - Stanley
1
如果你完成所有这些步骤后它仍然不是一个函数呢? - Br.Bill
如果@Stanley的解决方案不起作用,还可以尝试这个:https://dev59.com/c3RA5IYBdhLWcg3wzhRY - Adam Grant
我用这个方法从 Ruby 1.9.3 更新到 2.0.0,这是正确的方式吗?我之前一直遇到“rvm 不是一个函数”的错误。 - Connor Leech
显示剩余7条评论

245

你没有使用登录shell。

启用登录标记的过程在这里描述,还可以在这里找到一些关于登录shell的详细信息。

因此,您需要检查Gnome终端设置中的选项"Run as login shell"。在设置该标记后,需要打开新的终端。

有时需要将命令设置为/bin/bash --login


对于远程连接,重要的是了解运行交互式ssh会话和执行单个命令之间的区别。

当运行ssh server并在服务器上进行交互式工作时,默认情况下使用的是登录shell,一切正常,但对于ssh server "command",您不使用登录shell,需要使用ssh server 'bash -lc "command"'来运行。

任何远程调用都可能出现与使用ssh执行单个命令相同的问题。


4
在Mac上,相应的解决方案是什么? - Adam Grant
8
尝试运行命令 rvm get stable --auto 并检查您的终端设置。 - mpapis
10
请注意:我们在设置后不得不启动一个新的终端。 - oma
2
@mpapis,我该如何在无法将X服务器转发到我的计算机的远程服务器上设置gnome-terminal以“作为登录shell运行命令”? - Waseem
12
为了遵循@mpapis的建议,--auto已被弃用,改为使用--auto-dotfiles,所以现在的命令是:rvm get stable --auto-dotfiles - Mart Van de Ven
显示剩余6条评论

108

要永久解决此问题,只需剪切/粘贴以下行:

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

从:~/.bash_profile 文件中

到:~/.bashrc 文件中

这样做的原因是每次进入终端时都会执行 .bashrc,而每次登录时都会执行 .bash_profile。这就是为什么解决方案 /bin/bash --login 可行,但您必须每次进入终端都要这样做。这种方法可以使您设置直到下一次格式化硬盘,那时您就会忘记所有这些 :)。


作为一个屏幕用户,我总是需要把这一行放在~/.bashrc而不是~/.bash_profile中。 - ryenus
2
谢谢!我非常困扰 Gnome 登录需要两秒钟的延迟。这将防止那种延迟。 - justinpage
7
为什么RVM安装不会自动执行这个步骤? - balki
@mpapis是rvm的发布经理,他说这样做“可能会导致X会话失败(如果我没记错的话,Fedora 17),它会失败rsync会话...还有更多原因我现在想不起来了。”我想我只会坚持使用/bin/bash --login - kimbaudi

30

我也遇到了这个问题。最后我在终端上执行了这条命令。

source ~/.rvm/scripts/rvm

问题已经解决。因为这行代码会使RVM实例成为一个特定时间的函数。


2
最简单的答案。只需将该行代码放入您的~/.bashrc文件中,就可以在任何终端模拟器中使用了。 - Nikkolasg
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - will
1
你是真正的MVP。在我尝试了这个之前,没有其他东西起作用。我不在乎它是否暂时,我只是需要一个解决方案。 - ian-campbell
rvm的安装文件在哪里?这样安装时,它就会处理这个和其他问题。我按照他们主页上描述的过程进行了操作,花费了数小时来让它“正常工作”。应该有类似于“yum install rvm”的东西,一切都完成并准备就绪。 - JosephK

21
最新版本的RVM(rvm 1.11.6(稳定版))在Ubuntu(10.10 - 64位-nerdy gnat或其他版本)上无法正常工作,我一直看到以下错误信息: “RVM不是一个函数,“rvm use ...”选择ruby将不起作用。” 之前,我也看到过这个错误信息,但使用“rvm 1.9.3-p0@ rails321”可以正常工作。现在,它不能正常工作-你根本无法改变gemsets。 直到我找到了这个方法,才解决了问题-将下面这行代码放到/home/your-name/.bashrc文件的最后一行中: [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"

2
将"rvm get stable --auto"添加到.bash_login [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm",并从.bashrc中删除 - 我在.bashrc的末尾添加了source ~/.bash_login,并在任何在中途更改gemsets的脚本的开头添加了它。 - Rod McLaughlin

10

就如你所说,显示的错误可能是以下这个。

RVM is not a function, selecting rubies with 'rvm use ...' will not work.

You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command. 
Please visit https://rvm.io/integration/gnome-terminal/ for a example.

如上所述,在终端中键入“/bin/bash --login”(在重新启动终端后),然后键入命令“rvm use 1.9.3”(例如)即可开始使用相同版本。

只需执行命令“ruby -v”来确认RVM正在使用更新的Ruby版本。


9
我在新安装的rvm上也遇到了这个问题,这里的任何答案都没有解决它。进入官方rvm网站,在基础部分,他们有这个命令: # 来自http://rvm.io/rvm/basics source $(rvm 1.9.3 do rvm env --path) 你应该把1.9.3改为你实际想要的ruby版本,并使rvm成为一个函数,不管shell类型如何。

7

也许您可以尝试以下操作:

  • 打开您的终端 ->
  • 点击“编辑” ->
  • 选择“配置文件首选项” ->
  • 找到“标题和命令” ->
  • 勾选“以登录 shell 运行命令”
  • 完成

这是最简单和正确的解决方案,因为普通 shell 会跳过 .profile,使用此选项将导致它加载并且不需要编辑 .bashrc。 - DWils

7

运行 bash --login,然后运行rvm use 2.0.0


7

即使您已经接受了一个答案,我还想提供另一种方法.. ~/.bashrc 在打开任何 shell 之前都会被加载。将该行添加到末尾,您就不需要任何登录 shell。


“login shell” 这个东西是有原因的,我已经进行了许多 RVM 源代码测试,这是唯一能够保证工作不出现难以检测和解决错误的方法。 - mpapis
@mpapis,你能解释一下原因吗?从其他答案来看,大多数人都认为将该行移动到rc文件中是可以的。 - balki
例如,它可能会导致X会话失败(如果我没记错的话,这是在Fedora 17中发生的),它会导致rsync会话失败...还有更多原因我现在想不起来了。 - mpapis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,