为什么bash -l -c“CMD”让ruby找到我的gem?

在我的ruby脚本中,我需要gmail gem:

require 'rubygems'
require 'gmail'

在shell中运行时,它可以正常工作:

ruby my-script.rb

当我把它放在一个cron作业时,它无法执行:

* * * * * cd /to/script/directory;/usr/local/rvm/rubies/ree-1.8.7-2011.03/bin/ruby ./my-script.rb

日志显示无法加载gmail gem:

/usr/local/rvm/rubies/ree-1.8.7-2011.03/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require': no such file to load -- gmail (LoadError)

好吧,当我这样做时(把cmd放在bash -l -c’CMD’中):

* * * * * /bin/bash -l -c 'cd /to/script/directory;/usr/local/rvm/rubies/ree-1.8.7-2011.03/bin/ruby ./my-script.rb'

它再次正常工作。

为什么?

ps.I知道arg -l使bash成为登录shell,但这有什么不同吗?

-l参数在登录shell中执行该命令,这意味着它从您的shell配置文件inheritance您的路径和其他设置。 如果在没有登录shell的情况下运行,则cron作业将在没有设置任何路径环境变量的情况下运行(例如由RVM设置的那些),这导致系统无法找到引用的gem。

rvm要求您使用shell登录,请参阅常见问题解答 。

我怀疑你在登录脚本中加载RVM,ergo RVM只能在登录shell中使用。