在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