在设置环境变量时从ruby中取出shell

时间:2011-11-28 19:35:57

标签: ruby shell environment

我需要在为它设置环境变量时为一个进程进行shell。我试过这个单行:

system "RBENV_VERSION=system ruby extconf.rb"

这个语法适用于shell脚本但不适用于ruby。更新:)结果证明这个语法毕竟是来自ruby,但是我没有看到它的效果我的特定用例。)

所以我这样做:

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

我被迫做了这么长的表达,因为如果环境变量已有值,我不想永久覆盖它。

你想到什么更短的东西?

5 个答案:

答案 0 :(得分:66)

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

system接受Process.spawn接受的任何论据。

答案 1 :(得分:6)

Ruby 1.9包含Process::spawn,允许提供environ哈希。

Process::spawn也是systemexecpopen等的基础。 您可以将环境传递给每个人。

在Ruby 1.8下,您可能需要考虑POSIX::Spawn库,
它提供相同的接口

答案 2 :(得分: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

答案 3 :(得分:3)

实际上这对我有用。

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

但如果没有,也许您可​​以尝试将“env”添加到您需要的任何变量中。例如。

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

答案 4 :(得分:2)

这可能有用吗?

system <<-CMD
export VARNAME=123
other_command
CMD