Оболочка из ruby ​​при установке переменной окружения - PullRequest
19 голосов
/ 28 ноября 2011

Мне нужно выложить на процесс при настройке переменной окружения для него. Я попробовал этот однострочник:

system "RBENV_VERSION=system ruby extconf.rb"

Этот синтаксис работает в сценарии оболочки, но не в ruby. ( Обновление: , в конце концов, этот синтаксис работает от ruby, но я не смог увидеть его эффект из-за моих особенностей потребительная случай.)

Итак, я делаю это:

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

Я вынужден использовать такое длинное выражение, потому что не хочу постоянно переопределять переменную среды, если она уже имеет значение.

Что-нибудь более короткое, что приходит на ум?

Ответы [ 5 ]

66 голосов
/ 28 ноября 2011
system({"MYVAR" => "42"}, "echo $MYVAR")

system принимает любые аргументы, которые Process.spawn принимает.

6 голосов
/ 28 ноября 2011

Ruby 1.9 включает Process::spawn, что позволяет предоставлять хэш среды.

Process::spawn также является основой для system, exec, popen и т. Д.
Вы можете передать окружение каждому.

В Ruby 1.8 вы можете рассмотреть библиотеку POSIX::Spawn,
который обеспечивает те же интерфейсы

4 голосов
/ 28 ноября 2011

Используя тот же подход, но в качестве блочного метода, который временно изменяет среду (например, блочную форму 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 голосов
/ 28 ноября 2011

На самом деле это сработало для меня.

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})
2 голосов
/ 28 ноября 2011

Это может сработать?

system <<-CMD
export VARNAME=123
other_command
CMD
...