在设置环境变量时从ruby中取出shell
我需要在为它设置环境变量的同时对一个进程进行shell。 我试过这个单行:
system "RBENV_VERSION=system ruby extconf.rb"
此语法适用于shell脚本,但不适用于ruby。 ( 更新:事实certificate这个语法毕竟是来自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
,它允许提供environ哈希。
Process::spawn
也是system
, exec
, popen
等的基础。
您可以将环境传递给每个人。
在Ruby 1.8下,您可能需要考虑POSIX::Spawn
库,
它提供相同的接口
使用相同的方法,但包装为临时修改环境的块方法(如Dir.chdir
的块forms):
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
实际上这对我有用。
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})
这可能有用吗?
system <<-CMD export VARNAME=123 other_command CMD