Как получить переменные среды для командной оболочки в сценарии Ruby? - PullRequest
6 голосов
/ 26 января 2010

Я пытаюсь запустить некоторые сторонние bash-скрипты из моей программы ruby.

Прежде чем я смогу их запустить, они требуют от меня создания файла. В командной строке все работает нормально, но в Ruby это не работает. Я обнаружил, что системные команды откроют новый дочерний процесс оболочки, и любой источник будет сделан в этом, и его нельзя увидеть из родительского процесса оболочки, выполняющего скрипт Ruby. Когда системный вызов завершается, дочерняя оболочка также уничтожается.

Как мне обойти эту проблему?

Ответы [ 5 ]

8 голосов
/ 26 января 2010

Сделайте это:

$ source whatever.sh
$ set > variables.txt

А потом в Ruby:

File.readlines("variables.txt").each do |line|
  values = line.split("=")
  ENV[values[0]] = values[1]
end

После того, как вы запустите это, ваша среда должна быть в порядке.

2 голосов
/ 06 сентября 2012

Это ужасно, но ..

env = %x{. /some/shell/script/which/setups/your/env && env}
env.split("\n").each do |line|
  key, value = line.split("=", 2)
  ENV[key] ||= value unless value.nil? or value.empty?
end
2 голосов
/ 26 января 2010

Я не уверен, правильно ли я понимаю ваш вопрос. Вы пытаетесь создать сценарий оболочки перед запуском другого? В этом случае ответ прост:

#!/bin/env ruby
system "source <path_to_source_file> && <command>"

Если исходный файл содержит переменные, которые ваша команда должна использовать, вы должны export их. Также возможно установить переменные окружения в вашем скрипте Ruby, используя ENV['<name_of_var>'] = <value>.


Обновление: 26 января 2010 г. - 15: 10

Вы можете использовать IO.popen, чтобы открыть новую оболочку:

IO.popen("/bin/bash", "w") do |shell|
  shell.puts "source <path_to_source_file>"
  shell.puts "<command>"
end
0 голосов
/ 12 мая 2015

Изменение ENV работает только для одного потока, и я делаю ниже. Но у меня есть вопрос, как использовать объединенную копию среды с IO.popen? как-то это не похоже на работу.

с "системой" я могу сделать:

# ... create new "path" here

    subEnv = Hash.new;
    subEnv.merge!(ENV); # copy old environment
    subEnv['PATH'] = path; # set new values in copy

    system(subEnv, commandLine);
0 голосов
/ 10 апреля 2012

Я сделал это, потому что я не хотел писать файл или смешивать мой код ruby ​​с этим материалом:

#!/usr/bin/env bash
eval $(echo "$(cat .env) $1" | tr '\n' ' ')

Я положил это в ~ / bin / run_with_env.sh, а затем, например, я могу запустить:

% run_with_env.sh "rails console"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...