我需要在为它设置环境变量时为一个进程进行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
我被迫做了这么长的表达,因为如果环境变量已有值,我不想永久覆盖它。
你想到什么更短的东西?
答案 0 :(得分:66)
system({"MYVAR" => "42"}, "echo $MYVAR")
system
接受Process.spawn
接受的任何论据。
答案 1 :(得分:6)
Ruby 1.9包含Process::spawn
,允许提供environ哈希。
Process::spawn
也是system
,exec
,popen
等的基础。
您可以将环境传递给每个人。
在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