代码之家  ›  专栏  ›  技术社区  ›  wilhelmtell

在Ruby中导出环境变量

  •  37
  • wilhelmtell  · 技术社区  · 14 年前

    如何将环境变量从Ruby脚本中导出到父shell?例如,实施 read 巴什建筑:

    #!/usr/bin/ruby
    
    varname = ARGV[0]
    ENV[varname] = STDIN.gets  # but have varname exported to the parent process
    
    4 回复  |  直到 9 年前
        1
  •  36
  •   Ignacio Vazquez-Abrams    14 年前

    简单的回答:你不能。

    更长的答案:除非操作环境提供了钩子,否则您不能这样做。大多数人不这样做。您通常能做的最好的事情是打印出您想要完成的工作分配,并让父级执行它们。

        2
  •  35
  •   rampion    14 年前

    不能将环境变量导出到运行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
    %
    

    另一种选择是使用 ENV[]= 是否为从Ruby进程中打开的子程序设置环境变量。例如:

    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 
    

    如果你把它和贝壳的结合在一起,它会非常有效。 exec 命令,它将用Ruby进程替换外壳(这样,当您退出内部外壳时,外壳也会自动退出,从而避免出现“我以为在这个外壳中设置了该变量”的混淆)。

    # open terminal
    % exec pass_var.rb BAZ
    3
    % echo $BAZ
    3
    % exit
    # terminal closes
    
        3
  •  7
  •   peterk    13 年前

    我刚试过这个,看起来不错。

    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);
    

    这似乎很有效-至少在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个子流程

    Use Process.spawn(env,command)
    
    pid = Process.spawn({ 'FOO'=>'foo in spawned process'}, cmd );
    pid = Process.wait();  
    

    这类似于C系统调用,允许您指定管道和其他所有东西。

        4
  •  -1
  •   Seeder    9 年前

    在Ruby中打印出标准的导出代码怎么样:

    puts "export MYVAR=value"
    

    然后使用shell backtick在shell命令处执行:

    $ `./myscript.rb` 
    

    这将获取脚本的输出并执行它,在诸如bash和zsh之类的现代shell中工作。