Tôi vừa thử điều này và có vẻ tốt.
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);
Điều này dường như làm việc tốt - ít nhất là trên MacOSX
tôi nhận được
FOO is ""
In child process. parent pid is 1388
FOO is "foo in sub process"
Child (pid 1388) terminated with status 99
FOO is ""
vẻ đẹp trong nó khôi phục trạng thái trước khi tự động
Ok - bây giờ cố gắng một chương trình khác như điều này không sinh ra 2 quy trình con
Use Process.spawn(env,command)
pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd);
pid = Process.wait();
Hành vi này giống như cuộc gọi hệ thống C và cho phép bạn chỉ định đường ống và tất cả những thứ khác nữa.
Tôi đã nhìn thấy [một câu hỏi tương tự] (http://stackoverflow.com/questions/190168/persisting-an-environment-variable-through-ruby) nhưng tôi 'không thỏa mãn ed với câu trả lời theo nền tảng cụ thể. – wilhelmtell