How do I source environment variables for a command shell in a Ruby script?
我正在尝试从我的ruby程序中运行一些第三方bash脚本。
在我运行它们之前,它们需要我来源文件。 在命令行上它一切正常但在Ruby中它不起作用。 我发现系统命令将打开一个新的子shell进程,任何源代码都将在那里完成,并且无法从运行Ruby脚本的父shell进程中看到。 当系统调用结束时,子shell也被杀死。
我如何解决这个问题?
做这个:
1 2 | $ source whatever.sh $ set > variables.txt |
然后在Ruby中:
1 2 3 4 | File.readlines("variables.txt").each do |line| values = line.split("=") ENV[values[0]] = values[1] end |
在你运行之后,你的环境应该很好。
这太可怕了,但是......
1 2 3 4 5 6 | env = %x{. /some/shell/script/which/setups/your/env && env} env.split(" ").each do |line| key, value = line.split("=", 2) ENV[key] ||= value unless value.nil? or value.empty? end |
我不确定我是否正确理解你的问题。您是否尝试在运行另一个脚本之前获取shell脚本?在这种情况下答案很简单:
1 2 | #!/bin/env ruby system"source <path_to_source_file> && <command>" |
如果源文件包含您的命令应该使用的变量,则必须
更新:2010年1月26日 - 15:10
您可以使用IO.popen打开一个新shell:
1 2 3 4 | IO.popen("/bin/bash","w") do |shell| shell.puts"source <path_to_source_file>" shell.puts"<command>" end |
修改ENV仅适用于单个线程,而是执行以下操作。
但是我有一个问题如何使用IO.popen的环境合并COPY?不知何故它似乎没有用。
用"系统"我能做到:
1 2 3 4 5 6 7 | # ... create new"path" here subEnv = Hash.new; subEnv.merge!(ENV); # copy old environment subEnv['PATH'] = path; # set new values in copy system(subEnv, commandLine); |
我之所以这样做,是因为我不想写这个文件或将我的ruby代码与这些东西混淆:
1 2 3 | #!/usr/bin/env bash eval $(echo"$(cat .env) $1" | tr ' ' ' ') |
我把它放在?/ bin / run_with_env.sh然后例如我可以运行:
1 | % run_with_env.sh"rails console" |