我需要将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"
答案 0 :(得分: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,但外壳魔法更少。
答案 1 :(得分:3)
你无法做你想要的,因为RVM必须在当前的shell中获得。您的问题实际上也不太可能是RVM;你真的定时了吗?
我反复描述它,而我的最慢的时间不到2/10秒:
$ time "$HOME/.rvm/scripts/rvm"
real 0m0.165s
user 0m0.068s
sys 0m0.036s
确实,RVM在 cd 命令中有一些处理开销(根据this blog entry,关于约60ms的关闭顺序),但它是微不足道的。其他方法(如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 - 即便如此,整个事情也会在一秒钟之内加载。这对我来说似乎很合理。