2009-10-09 113 views
3

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

回答

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 "[email protected]" 

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

# rest of ruby script here 

这是与-x红宝石运行一个shell脚本,这将导致解释程序跳过直到它找到#!.*ruby。这会给你一个恢复环境的机会。 -x后面的.是一个noop,你可以取出.,或者用目录替换它。在运行脚本之前,Ruby将会在那里进行cd操作

我实际上猜测这不是你想要的,因为这可以通过制作两个脚本来完成,一个用于shell,一个用于Ruby。也许Ruby关心的环境变量的列表将帮助...

+0

这种方法还允许ruby代码通过'$ stdin.read'访问stdin上的任何输入,非常方便。 –

0

您可以在您的Ruby脚本中修改以下任何内容:$ :, $ -I或$ LOAD_PATH?这些都只是指向一个指定了红宝石查找类和其他蜉蝣在同一阵列...

>> $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", "."] 
2

我不认为$LOAD_PATH用于宝石(至少,不是唯一的)。你可能想看看,但没有在这里没有提到一对夫妇的环境变量:

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

你可以看到宝石的电流路径:

require 'rubygems' 
puts Gem.path 

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

+0

FWIW,我正尝试使用来自不同用户的ruby exe和gems,并且执行'export GEM_PATH = <其他用户的GEM_PATH>'为我工作。 –