GVDB = '~/.irb.globals' unless defined? GVDB
NOSAVE_VARS = global_variables
gvdb_file = File.expand_path(GVDB)
if File.exists?(gvdb_file)
gvars = Marshal.load(File.read(gvdb_file))
gvars.each_key do |var|
eval "#{var} = gvars['#{var}']"
end
end

Kernel.at_exit {
gvars = (global_variables - NOSAVE_VARS).inject({}) {|h, v| h[v] = eval(v); h }
open(gvdb_file, 'w') {|out| out.print Marshal.dump(gvars) }
}