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

标签 ruby bash shell path rubygems

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

require 'rubygems'<br/> 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.我知道arg -l使 bash 成为登录 shell,但这有什么不同吗?

最佳答案

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

关于ruby - 为什么 bash -l -c "CMD"让 ruby 找到我的 gem ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347294/

相关文章:

linux - 如何 gzip bash 中所有子目录中的所有文件

ruby-on-rails - 带有自定义放置操作的 Rails 路由错误

ruby-on-rails - Rails 日期晚于

ruby - 使用 heredoc 作为哈希值

bash - 将标准输出复制到标准错误

linux - diff 命令仅获取不同行数

python - 使用脚本填充 Sql 表

c - 嵌入 Ruby,从 C 调用函数

linux - 如何将脚本的输出保存到日志中

linux - 在 bash 中替换/更新文本文档中的列值