-1

我需要将 RVM作为函数加载到 shell 会话中 ,所以我在我的 zshrc 中执行这个脚本。

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

但是,每当我启动一个新终端时,这个脚本会让我慢约 1 秒。所以我想出了一个解决方案,将这个脚本放到后台工作中,如下所示:

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

然后,当我启动一个新终端时,我得到了一个快速启动时间。但我会看到这条消息:

[1]  + done       source "$HOME/.rvm/scripts/rvm"
  1. 有没有更好的方法让这个脚本不会减慢我的终端启动时间?
  2. 当这个后台工作完成时,如何抑制这个“完成”消息?
4

2 回答 2

3

这不适用于 rvm 之类的东西。rvm 依赖于能够操纵当前 shell 的环境(定义自己的 shell 函数等)。当您将作业置于后台时,它会在对当前 shell 没有影响的子进程中运行。例子:

[0 mbunkus@chai-latte ~] print $some_var

[0 mbunkus@chai-latte ~] cat the-file
some_var=some_value
[0 mbunkus@chai-latte ~] source the-file &
[1] 17090
[0 mbunkus@chai-latte ~]
[1]  + done       source the-file
[0 mbunkus@chai-latte ~] print $some_var

[0 mbunkus@chai-latte ~] source the-file
[0 mbunkus@chai-latte ~] print $some_var
some_value

如果 rvm 对您来说太慢了,那么您还可以查看rbenv,它的功能与 rvm 类似,但外壳魔法要少得多。

于 2012-06-21T13:06:59.473 回答
3

分析

您不能按照您的要求做,因为 RVM 必须在当前 shell 中获取。您的问题实际上也不太可能是 RVM。你真的计时了吗?

我反复分析它,我最慢的时间不到 2/10 秒:

$ time "$HOME/.rvm/scripts/rvm"

real        0m0.165s
user        0m0.068s
sys         0m0.036s

确实,RVM 使用cd命令有一些处理开销(根据此博客条目,约为 60 毫秒),但它是微不足道的。其他方法(例如 rbenv)只是将开销转移到其他地方。

解决方案

在您自己的系统上计时 RVM。然后是时间source ~/.bashrc或您正在调用的任何启动文件。很有可能,是你的 shell 初始化中的其他东西让你陷入了困境。

例如,在我的系统上,一个交互式 shell 大约需要 8/10 秒的时间来加载:

$ time bash -ic 'exit' > /dev/null 2>&1

real        0m0.853s
user        0m0.320s
sys         0m0.148s

只有 19% 的时间花在加载 RVM 上——即便如此,整个加载时间也不到一秒。这对我来说似乎很合理。

于 2012-06-21T14:09:27.207 回答