Ответ 1
Существует очень простой способ:
system({"MYVAR" => "42"}, "echo $MYVAR")
Все это относится к Avdi: fooobar.com/questions/286749/...
Я использую ruby 1.8.7 patch 249. Является ли следующий/лучший способ передать переменные окружения команде оболочки, которую мне нужно выполнить из моей рубиновой программы?
fork do
ENV['A'] = 'A'
exec "/bin/bash -c 'echo $A'"
end
Process.wait
Существует очень простой способ:
system({"MYVAR" => "42"}, "echo $MYVAR")
Все это относится к Avdi: fooobar.com/questions/286749/...
docs для метода Ruby exec
кажется неполным, но он говорит, что есть необязательный первый аргумент env
, поэтому предположительно который определяет среду. Я получил обоснованное предположение и некоторые эксперименты, и выяснил, что правильный способ его использования заключается в следующем:
exec({"A"=>"A"}, "/bin/bash -c 'echo $A'")
РЕДАКТИРОВАТЬ 1: Извините, не работает для более старых версий Ruby.
Для пользователей 1.8 ~ - реплицирует 1.9 поведение exec. То же, что и первоначальная попытка OP.
def exec_env(hash, cmd)
hash.each do |key,val|
ENV[key] = val
end
exec cmd
end
exec_env({"A"=>"A"}, "/bin/bash -c 'echo $A'")
Я бы сделал это в одной строке
exec "/bin/bash -c 'A=hello; echo $A'"