在Ruby中导出一个环境variables
如何从Ruby脚本中将环境variables导出到父shell? 例如,实现read
Bash内build的简单实现:
#!/usr/bin/ruby varname = ARGV[0] ENV[varname] = STDIN.gets # but have varname exported to the parent process
简单的回答:你不能。
较长的回答:除非操作环境提供钩子,否则不能。 大多数不。 通常你可以做的最好的是打印出你想完成的任务,并让父母执行它们。
您不能将环境variables导出到运行ruby脚本的shell中,但是您可以编写一个ruby脚本来创build源代码的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 %
另一种select是使用ENV[]=
为从ruby进程中打开的子壳体设置环境variables。 例如:
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
如果将它与shell的exec
命令结合起来,这可能是相当有效的,它将用ruby进程replaceshell(所以当你退出内壳时,shell也自动退出,防止任何“我以为我在这个shell中设置了这个variables“confusion”。
# open terminal % exec pass_var.rb BAZ 3 % echo $BAZ 3 % exit # terminal closes
我只是试了一下,看起来不错。
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);
这似乎工作得很好 – 至less在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个subprocess
Use Process.spawn(env,command) pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd ); pid = Process.wait();
这就像C系统调用,并允许你指定pipe道和所有其他的东西。
如何在ruby打印出标准的出口代码:
puts "export MYVAR=value"
然后使用shell反引号在shell命令中执行它:
$ `./myscript.rb`
这将采取脚本的输出并执行它,工作在现代贝壳如bash和zsh