2012-02-20 15 views
14

私はruby 1.8.7パッチ249を使用しています。私は自分のルビープログラムから実行する必要のあるシェルコマンドに環境変数を渡す最も良い方法はありますか?環境変数をexecシェルコマンドに渡す正しい方法

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

Process.wait 
+0

:http://stackoverflow.com/questions/8301294 /シェルルアウト時から環境変数を設定中 –

答えて

0

私は

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

私は自分のやり方が気に入っています。なぜなら、セミコロン、シングルクォート、そしてbashが特別な方法。 –

11

docs for Ruby's exec methodが不完全に見える1行でそれを行うだろうが、それはそこにenvと呼ばれるオプションの最初の引数があるので、おそらくそれは環境を指定言うん。 1

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

EDIT:申し訳ありませんが、ルビーの古いバージョンでは動作しません推測し、いくつかの実験では、私はそれを使用するための正しい方法は、これがあることが分かりました。

+2

また、プログラムを実行しようとしていて、派手なシェル機能が必要ない場合は、 'bash'を関与させる必要はありません。たとえば、 'exec({}、" ls ")'はうまく動作し、bashを起動しなかったので少し速くなるはずです。 –

+0

偉大な答え、私は1年以上前にこれを理解したにもかかわらず、まだこれはドキュメント([rdoc.info](http://rdoc.info/stdlib) /core/1.9.3/Kernel:exec)docsは少し違っていて、プログラムとその引数の後ろにenvハッシュを置くように見えます)。 –

+0

@DavidGrayson:これは1.8.7でも有効ですか? –

3

1.8ユーザーの場合 - execの1.9の動作を複製します。しかし、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'") 
+0

これは 'exec'が' exec'を返すことはないので動作しますが、同じシグネチャを持つ 'system'では' system(env_hash、command) 'で設定された環境変数が設定されていますが、コマンドが完了するとRubyの 'ENV'に残されます。 –

23

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

このためすべてのクレジットはAvdiに行く:https://stackoverflow.com/a/8301399/171933 system` `のための同じ

+1

'popen3'はstdin、stdout、stderrの制御と同じ振る舞いをしていることに注意してください。[https://ruby-doc.org/stdlib-2.4.0/libdoc/open3/rdoc/Open3.html#method -c-popen3](https://ruby-doc.org/stdlib-2.4.0/libdoc/open3/rdoc/Open3.html#method-c-popen3) –

関連する問題