2009-10-09 79 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>'爲我工作。 –