如何在无环境的Ruby脚本中指定rubygems路径?

时间:2009-10-09 19:29:52

标签: ruby path environment gem

我已经在Ruby中为Cacti编写了一个数据收集脚本,它在命令行中运行良好,但是 Cacti通过“env -i”运行脚本,这剥夺了环境,所以Ruby不能找到rubygems库(“在`require'中:没有这样的文件加载 - ruby​​gems(LoadError)”)。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:3)

#!/bin/sh

#export LOAD_PATH=whatever 
#export RUBYLIB=whatever
#export RUBYOPT=whatever
#export RUBYPATH=whatever
#export RUBYSHELL=whatever
#export PATH=$PATH:whatever
exec ruby -x. $0 "$@"

#!/usr/bin/ruby
require 'rubygems'
require 'open4' # or whatever

# rest of ruby script here

这是一个使用-x运行ruby的shell脚本,这会导致解释器跳过行,直到找到#!.*ruby。这将使您有机会恢复环境。 .之后的-x是noop,您可以取出.,或将其替换为目录。在运行脚本之前,Ruby会在那里cd。

我实际上猜测这不是你想要的,因为只需要制作两个脚本,一个用于shell,一个用于Ruby,这可以毫无诡异地完成。也许Ruby所关心的环境变量列表会有所帮助......

答案 1 :(得分:2)

我不认为$LOAD_PATH用于宝石(至少,不是唯一的)。您可能希望查看此处尚未提及的几个环境变量:

ENV['GEM_HOME']
ENV['GEM_PATH']

您可以通过以下方式查看宝石的当前路径:

require 'rubygems'
puts Gem.path

部分答案可能在这里:comp.lang.ruby post

答案 2 :(得分:0)

您可以在Ruby脚本中修改以下任何内容:$:,$ -I或$ LOAD_PATH吗?这些都指向同一个数组,它指定Ruby查找类和其他ephemera的位置......

>> $LOAD_PATH
=> ["/usr/local/lib/ruby/site_ruby/1.8", "/usr/local/lib/ruby/site_ruby/1.8/i686-darwin9.5.0", "/usr/local/lib/ruby/site_ruby", "/usr/local/lib/ruby/1.8", "/usr/local/lib/ruby/1.8/i686-darwin9.5.0", "."]