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