Правильный путь передачи переменных среды команде exec shell

Я использую ruby ​​1.8.7 patch 249. Является ли следующий/лучший способ передать переменные окружения команде оболочки, которую мне нужно выполнить из моей рубиновой программы?

fork do       
   ENV['A'] = 'A'
   exec "/bin/bash -c 'echo $A'"
end

Process.wait

Ответы

Ответ 1

Существует очень простой способ:

system({"MYVAR" => "42"}, "echo $MYVAR")

Все это относится к Avdi: fooobar.com/questions/286749/...

Ответ 2

docs для метода Ruby exec кажется неполным, но он говорит, что есть необязательный первый аргумент env, поэтому предположительно который определяет среду. Я получил обоснованное предположение и некоторые эксперименты, и выяснил, что правильный способ его использования заключается в следующем:

exec({"A"=>"A"}, "/bin/bash -c 'echo $A'")

РЕДАКТИРОВАТЬ 1: Извините, не работает для более старых версий Ruby.

Ответ 3

Для пользователей 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'")

Ответ 4

Я бы сделал это в одной строке

exec "/bin/bash -c 'A=hello; echo $A'"