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

mis*_*lav 20 ruby shell environment

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

system "RBENV_VERSION=system ruby extconf.rb"
Run Code Online (Sandbox Code Playgroud)

此语法适用于shell脚本,但不适用于ruby.(更新:事实证明这个语法毕竟是来自ruby,但由于我的特殊用例,我没有看到它的效果.)

所以我这样做:

rbenv_version = ENV['RBENV_VERSION']
ENV['RBENV_VERSION'] = 'system'
begin
  system "ruby extconf.rb"
ensure
  ENV['RBENV_VERSION'] = rbenv_version
end
Run Code Online (Sandbox Code Playgroud)

我被迫这么长的表达式,因为我不想永久覆盖环境变量,如果它已经有一个值.

想到什么更短的东西?

Avd*_*vdi 67

system({"MYVAR" => "42"}, "echo $MYVAR")
Run Code Online (Sandbox Code Playgroud)

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


小智 6

Ruby 1.9包含Process::spawn允许提供environ哈希的包含.

Process::spawn也是为基础system,exec,popen
你可以传递一个环境给每个.

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