3

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

4

3 回答 3

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. 这将使您有机会恢复环境。.after是 noop ,-x你可以取出.,或者用目录替换它。Ruby 会在运行脚本之前 cd 到那里。

我实际上猜测这并不是您真正想要的,因为只需制作两个脚本,一个用于 shell,一个用于 Ruby,就可以在没有任何技巧的情况下完成此操作。也许Ruby关心的环境变量列表会有所帮助......

于 2009-10-09T20:07:25.123 回答
2

我不认为$LOAD_PATH用于宝石(至少,不完全是)。您可能想查看这里尚未提及的几个环境变量:

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

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

require 'rubygems'
puts Gem.path

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

于 2009-10-10T19:05:16.583 回答
0

您能否在 Ruby 脚本中修改以下任何内容:$:、$-I 或 $LOAD_PATH?这些都只是指向同一个数组,该数组指定 Ruby 在哪里寻找类和其他蜉蝣……

>> $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", "."]
于 2009-10-09T19:54:32.523 回答