Подтвердить что ты не робот

Выключение оболочки из рубина при установке переменной окружения

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

system "RBENV_VERSION=system ruby extconf.rb"

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 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

Ответ 4

Собственно, это сработало для меня.

[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})

Ответ 5

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

system <<-CMD
export VARNAME=123
other_command
CMD