Я только что попробовал это, и это выглядит хорошо.
cmd = "echo \"FOO is \\\"$FOO\\\"\"";
system(cmd);
# Run some Ruby code (same program) in the child process
fork do
puts "In child process. parent pid is #$$"
ENV['FOO']='foo in sub process';
system(cmd);
exit 99
end
child_pid = Process.wait
puts "Child (pid #{child_pid}) terminated with status #{$?.exitstatus}"
system(cmd);
Кажется, это работает хорошо - по крайней мере, на MacOSX
Я получаю
FOO is ""
In child process. parent pid is 1388
FOO is "foo in sub process"
Child (pid 1388) terminated with status 99
FOO is ""
Кажется, что приятно восстанавливает предыдущее состояние автоматически
Хорошо - теперь попробовал другой, поскольку это не порождает 2 подпроцесса
Use Process.spawn(env,command)
pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd );
pid = Process.wait();
Это действует как системный вызов C и позволяет вам указать каналы и все прочее.