Exporting an Environment Variable in Ruby
Simple answer: You can't.
Longer answer: You can't, unless the operating environment provides hooks to do so. Most do not. The best you can usually do is print out the assignments you want done and have the parent execute them.
You can't export environment variables to the shell the ruby script runs in, butyou could write a ruby script that creates a source-able bash file.
For example
% echo set_var.rb#!/usr/bin/env rubyvarname = ARGV[0]puts "#{varname}=#{STDIN.gets.chomp}"% set_var.rb FOO1FOO=1% set_var.rb BAR > temp.sh ; . temp.sh2% echo $BAR2%
Another alternative is that using ENV[]=
does set environment variables for subshells opened from within the ruby process. For example:
outer-bash% echo pass_var.rb#!/usr/bin/env rubyvarname = ARGV[0]ENV[varname] = STDIN.gets.chompexec '/usr/bin/env bash'outer-bash% pass_var.rb BAZquuxinner-bash% echo $BAZquux
This can be quite potent if you combine it with the shell's exec
command, which will replace the outer-shell with the ruby process (so that when you exit the inner shell, the outer shell auto-exits as well, preventing any "I thought I set that variable in this shell" confusion).
# open terminal% exec pass_var.rb BAZ3% echo $BAZ3% exit# terminal closes
I just tried this and it looks good.
cmd = "echo \"FOO is \\\"$FOO\\\"\""; system(cmd);# Run some Ruby code (same program) in the child processfork do puts "In child process. parent pid is #$$" ENV['FOO']='foo in sub process'; system(cmd); exit 99endchild_pid = Process.waitputs "Child (pid #{child_pid}) terminated with status #{$?.exitstatus}"system(cmd);
This seems to work well - at least on MacOSX
I get
FOO is ""In child process. parent pid is 1388FOO is "foo in sub process"Child (pid 1388) terminated with status 99FOO is ""
Seems nice in it restores prior state automatically
Ok - now tried a different one as this doesn't spawn 2 subprocesses
Use Process.spawn(env,command)pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd );pid = Process.wait();
This acts like the C system call and allows you to specify pipes and all that other stuff too.