2012-02-20 4 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/shell-out-from-ruby-while-setting-an-a-variable-variable –

답변

0

나는

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

나는 내 방식이 더 좋기 때문에 세미콜론, 작은 따옴표 및 배시가 특수 문자로 해석 할 수있는 다른 것에 대해 걱정할 필요가 없으므로 더 좋아진다. 방법. –

11

docs for Ruby's exec method이 불완전 보이는 한 줄에 그것을 할 것이지만,이 env를라는 선택적 첫 번째 인수는, 그래서 아마도 그 환경을 지정 말하는가. 1

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

편집 : 죄송합니다, 루비의 이전 버전에서 작동하지 않는 추측과 일부 번의 실험으로, 나는 그것을 사용하는 올바른 방법이 있음을 발견했다.

+2

프로그램을 실행하려고 할 때 멋진 쉘 기능이 필요 없다면'bash'를 사용하지 않아도된다는 말을하고 싶습니다. 예를 들어,'exec ({}, "ls")'는 정상적으로 작동하며 bash를 시작하지 않았기 때문에 조금 더 빨라야합니다. –

+0

위대한 대답은, 나는 1 년 또는 그 전에 전에 이것을 알아 냈습니다. 그러나 여전히 이것은 docs ([rdoc.info] (http://rdoc.info/stdlib))에서 올바른 방법이라고 생각하지 않았습니다. /core/1.9.3/Kernel:exec) docs는 조금 다르며 프로그램과 arg 뒤에 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'과 같은 서명을 가지고 있습니다 - 시스템 (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) –

관련 문제