【问题标题】:why bash -l -c "CMD" makes ruby find my gem?为什么 bash -l -c "CMD" 让红宝石找到我的宝石?
【发布时间】:2012-09-03 01:26:47
【问题描述】:

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

【问题讨论】:

    标签: ruby bash shell path gem


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      rvm 要求您使用 shell 登录,请参阅 FAQ

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-02-15
          • 1970-01-01
          • 2013-03-27
          • 1970-01-01
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多