wil*_*ell 37 ruby environment-variables
如何将Ruby脚本中的环境变量导出到父shell?例如,实现readBash内置的天真实现:
#!/usr/bin/ruby
varname = ARGV[0]
ENV[varname] = STDIN.gets # but have varname exported to the parent process
Run Code Online (Sandbox Code Playgroud)
Ign*_*ams 37
简单回答:你做不到.
更长的答案:你不能,除非操作环境提供钩子这样做.大多数人没有.您通常可以做的最好的事情是打印出您想要完成的任务,让父母执行它们.
ram*_*ion 36
您无法将环境变量导出到运行ruby脚本的shell中,但您可以编写一个ruby脚本来创建可源代码的bash文件.
例如
% echo set_var.rb
#!/usr/bin/env ruby
varname = ARGV[0]
puts "#{varname}=#{STDIN.gets.chomp}"
% set_var.rb FOO
1
FOO=1
% set_var.rb BAR > temp.sh ; . temp.sh
2
% echo $BAR
2
%
Run Code Online (Sandbox Code Playgroud)
另一个替代方案是使用ENV[]=为ruby进程中打开的子shell设置环境变量.例如:
outer-bash% echo pass_var.rb
#!/usr/bin/env ruby
varname = ARGV[0]
ENV[varname] = STDIN.gets.chomp
exec '/usr/bin/env bash'
outer-bash% pass_var.rb BAZ
quux
inner-bash% echo $BAZ
quux
Run Code Online (Sandbox Code Playgroud)
如果你将它与shell的exec命令结合起来可能会非常有效,它将用ruby进程替换外壳(这样当你退出内壳时,外壳也自动退出,防止任何"我想我在这个shell中设置该变量"混乱".
# open terminal
% exec pass_var.rb BAZ
3
% echo $BAZ
3
% exit
# terminal closes
Run Code Online (Sandbox Code Playgroud)
我刚试过这个,看起来不错.
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);
Run Code Online (Sandbox Code Playgroud)
这似乎运作良好 - 至少在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 ""
Run Code Online (Sandbox Code Playgroud)
看起来不错,它会自动恢复先前的状态
好的 - 现在尝试了另一个,因为这不会产生2个子进程
Use Process.spawn(env,command)
pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd );
pid = Process.wait();
Run Code Online (Sandbox Code Playgroud)
这类似于C系统调用,并允许您指定管道和所有其他东西.