2009-08-06 4 views
9

system (또는 백틱을 사용)을 통해 루비에서 명령을 실행하려고하는데 문제가 발생합니다. 명령을 호출하려고하면 쉘이 그것을 찾지 못한다. 비록 내가 직선이라면 그것이 작동한다는 것을 알지만. 예를 들어 :루비 시스템 호출에 사용할 셸을 어떻게 지정합니까?

`zip` 
>> sh: zip: command not found 

문제는 루비 $PATH 오히려 bash보다 올바르게 설정되어 있지되는 sh 쉘을 사용하고, 나는 이유를 잘 모르겠습니다 것으로 보인다. 내 응용 프로그램이 실행되는 사용자는 기본적으로 bash을 사용하도록 설정됩니다.

bash 대신에 sh을 사용하도록 루비에게 알릴 방법이 있습니까?

답변

0

zip 실행 파일의 전체 경로를 지정하는 것만으로는 안됩니다.

+0

그래, 할 수있어. 그 이유는 여러 개발 환경에서 개발되어 모든 경로에서 경로가 동일하지 않기 때문입니다. –

+2

whereis와 같은 명령은 항상 경로에 있어야합니다. 또는 모든 배포판의 공통 위치/usr/bin/whereis 이것은 흩어져있을 수있는 저장소를 찾는 좋은 해결책이 될 수 있습니다. –

4

Ruby가 C 함수를 사용하고 있다고 생각합니다.이 함수는 /bin/sh을 사용합니다. 대부분의 시스템에서 /bin/sh은 다른 쉘의 심볼릭 링크 일 뿐이므로 원하는대로 변경할 수 있습니다.

+0

흠./bin/sh는 실제로/bin/bash에 대한 심볼릭 링크입니다! 그래서 어떤 이유에서'PATH'가 평소와 다른 것으로 설정하고 있습니까? –

9

아는 한, 유일한 방법은 명시 적으로 쉘을 호출하는 것입니다.

`bash -c zip` 

또는

`#{ ENV['SHELL'] } -c zip` 

또는 시스템

: system("bash", "-c", command)

그러나 루비 (루비에 의해 만들어지는 모든 프로세스가) 따라서 부모 프로세스 '환경을 상속해야는 $ PATH는 경우에도 제대로 설정 다른 셸을 사용합니다. PATH가 올바르게 설정되지 않은 cron 작업이나 init 스크립트 등에서 루비를 돌릴 수 있습니까?

+0

전화가 웹에서 왔으며 cron이나 스크립트가 아닙니다. 아파치가 내 길을 바꿀 수 있을까요? –

+1

그럴 가능성이 매우 높습니다. (아마도 apache는 PATH를 변경하지 않지만 PATH는 일반적인 값으로 설정되지 않았습니다. 왜냐하면 rc 파일이 apache를 호출하기 전에 소스로 제공되지 않기 때문입니다). – sepp2k

+0

다중 단어 명령으로'zip'을 대체해야하고 여러 인수 (예를 들어'IO.popen')를 사용할 수없는 경우 이스케이프 된 따옴표를 사용하십시오 (예 : system ("bash -c \"cat food \ "")' –

관련 문제