2011-11-28 23 views
18

我需要爲進程設置環境變量時將其外殼取出。我想這一個班輪:在設置環境變量時從紅寶石中取出殼體

system "RBENV_VERSION=system ruby extconf.rb" 

這句法工作在shell腳本而不是從紅寶石。更新:原來這句法紅寶石作品畢竟,但是我沒有看到它的效果,由於我的特殊用例)

所以我這樣做:

rbenv_version = ENV['RBENV_VERSION'] 
ENV['RBENV_VERSION'] = 'system' 
begin 
    system "ruby extconf.rb" 
ensure 
    ENV['RBENV_VERSION'] = rbenv_version 
end 

我被迫這麼長時間的表達,因爲如果它已經有一個值,我不想永久覆蓋環境變量。

任何縮短到你的想法?

回答

63
system({"MYVAR" => "42"}, "echo $MYVAR") 

system接受Process.spawn接受任何參數。

+1

你達人。 \ o/ – mislav

+0

這是一個很好的答案。 ['Kernel#system'](http://ruby-doc.org/core-1.9.3/Kernel.html#method-i-system)的文檔在這個功能上還不夠清楚。非常好。 – Phrogz

+0

對於ruby 1.8,看看@ rtomayko的POSIX :: Spawn,在另一個評論中鏈接。 – alxndr

2

這可能工作?

system <<-CMD 
export VARNAME=123 
other_command 
CMD 
+1

這很有效。一行:'系統'導出VARNAME = 123 && other_command'' – mislav

6

Ruby 1.9包括Process::spawn它允許提供環境散列。

Process::spawn也是systemexecpopen基礎等
你可以傳遞一個環境給每個。

在Ruby 1.8中,你可能要考慮POSIX::Spawn庫,
它提供了相同的接口

+0

很高興知道!但是調用有點笨重:'Process.wait Process.spawn({「MYVAR」=>「42」},「echo $ MYVAR」)'爲了我的簡單需要。原來'system' func也支持這個可選的散列參數! – mislav

+0

'system'接受'Process.spawn()'接受的所有參數。例如,看我的答案。 – Avdi

3

使用您同樣的方法,但包裹起來作爲臨時修改環境(如塊形式的塊的方法的Dir.chdir):

def with_environment(variables={}) 
    if block_given? 
    old_values = variables.map{ |k,v| [k,ENV[k]] } 
    begin 
     variables.each{ |k,v| ENV[k] = v } 
     result = yield 
    ensure 
     old_values.each{ |k,v| ENV[k] = v } 
    end 
    result 
    else 
    variables.each{ |k,v| ENV[k] = v } 
    end 
end 

with_environment 'RBENV_VERSION'=>'system' do 
    `ruby extconf.rb` 
end 
+0

我經常在測試中使用這種方法,但在這裏它是一個矯枉過正。 – mislav

+0

@AnonymousDownvoter我鼓勵你降低_wrong_的答案,並且提出比其他人更好的答案。大概是因爲還有其他更好的答案(更簡單,更短)而不是Stack Overflow的精神,恕我直言。 – Phrogz

+0

+1首先,獲得不公平的downvote。第二,因爲這是我最喜歡的答案。直到我意識到你已經定義:with_environment,我才更興奮。這很令人傷心,因爲這是Ruby本身應該存在的方法。 –

3

其實這對我有效。

[email protected] ~ » irb                                  
1.9.3p0 :001 > system %{SHAIGUITAR=exists ruby -e 'puts ENV["SHAIGUITAR"]'} 
exists 
=> true 

但是,如果沒有,也許你可以嘗試將「env」預先加到你需要的任何變量上。例如。

system(%{env SHAIGUITAR=exists ruby bla.rb}) 
+0

它也適用於我。我是一個白癡,我嘗試了它並在沒有達到預期效果後將其丟棄,但這是因爲我的特殊使用情況,而不是因爲這不被支持。謝謝! – mislav

+0

唯一不適用於此的 - 這非常奇怪 - 是「回聲」示例。這就是爲什麼我將其他答案標記爲正確 - 它涵蓋了更多的案例。 – mislav