Ответ 1
system({"MYVAR" => "42"}, "echo $MYVAR")
system
принимает любые аргументы, которые принимает Process.spawn
.
Мне нужно отключить процесс, установив для него переменную окружения. Я попробовал этот однострочный лайнер:
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
Я вынужден к такому длинному выражению, потому что я не хочу постоянно переопределять переменную среды, если она уже имеет значение.
Что-нибудь короче, что приходит вам на ум?
system({"MYVAR" => "42"}, "echo $MYVAR")
system
принимает любые аргументы, которые принимает Process.spawn
.
Ruby 1.9 включает Process::spawn
, который позволяет предоставить хеш среды.
Process::spawn
также является основой для system
, exec
, popen
и т.д.
Вы можете передать среду каждому.
В Ruby 1.8 вам может понадобиться библиотека POSIX::Spawn
,
который обеспечивает те же интерфейсы
Используя тот же подход, но завернутый как блок-метод, который временно изменяет среду (например, блочную форму 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
Собственно, это сработало для меня.
[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})
Это может работать?
system <<-CMD
export VARNAME=123
other_command
CMD