2012-02-20 91 views
14

我正在使用ruby 1.8.7補丁249.以下是將環境變量傳遞給shell命令的最佳/唯一方法,我需要從我的ruby程序執行該命令?將環境變量傳遞給exec shell命令的正確方法

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

Process.wait 
+0

同爲'system':http://stackoverflow.com/questions/8301294/shell-out-from-ruby-while-setting-an-environment-variable – 2014-10-16 19:59:16

回答

0

我會做一個行

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

我更喜歡我的方式,因爲那樣你就不必擔心轉義分號,單引號和其他任何bash會在特殊情況下解釋的內容辦法。 – 2012-02-20 08:06:54

11

docs for Ruby's exec method似乎不完整的,但它確實說有一個叫env一個可選的第一個參數,所以想必指定環境。有猜測和一些實驗,我發現,用正確的方式是這樣的:

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

編輯1:對不起,暫時沒有針對老版本的Ruby的工作。

+2

我還想提一提,如果你只是想運行一個程序而不需要任何花哨的shell特性,那麼你不需要涉及'bash'。例如,'exec({},「ls」)'工作正常,應該快一點,因爲我們沒有啓動bash。 – 2012-02-20 08:08:22

+0

很好的答案,我在一年或更久之前就已經弄清楚了,但仍然沒有意識到這是從文檔中完成的正確方法([rdoc.info](http://rdoc.info/stdlib /core/1.9.3/Kernel:exec)docs有點不同,並且使它看起來像你應該在程序及其參數之後放置env hash)。 – 2012-02-20 08:26:26

+0

@DavidGrayson:你確定這個在1.8.7中有效嗎? – 2012-02-20 08:54:46

3

對於1.8〜用戶 - 複製exec的1.9行爲。儘管如此,OP與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'中。 – 2015-10-21 14:15:55

23

有一個非常簡單的方法:

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

這一切歸功於Avdi:https://stackoverflow.com/a/8301399/171933

+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) – 2017-06-27 06:27:51

相關問題