我可以加载RVM作为后台进程并使其作业控制消息静音吗?

时间:2012-06-21 12:14:59

标签: shell rvm zsh

我需要将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. 如何压制这个"完成"这个后台工作完成后的消息?

2 个答案:

答案 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 - 即便如此,整个事情也会在一秒钟之内加载。这对我来说似乎很合理。