2012-01-31 2 views
0

루비에 코드를 쓰고 있는데, 프로그램을 시작하기 전에 명령이 있는지 테스트하고 싶습니다. 명령이 설치되어 있지 않으면 오류 메시지를 표시하고 프로그램을 종료합니다. 그래서 지금, 나는 이것을하고있다.루비로 프로그램 종료하기

puts `type -P spark &>/dev/null && continue || { echo "You must install spark"; exit 0; } ` 

그래서, 모든 것이 잘 작동하지만, "종료 0"아니다, 나는 그 이유를 알아낼 수 없습니다. 이 문제를 해결할 생각이 있습니까? 아니면 더 나은 방법이 있습니까?

답변

3

스크립트를 끝내지 않는 이유는 이탈 호출이 백틱 내에 있기 때문입니다. spark를 실행하기 위해 호출 된 서브 쉘을 종료하지만 루비 스크립트를 해석하는 프로세스가 아닙니다.

$? 변수는 명령이 실행 된 후 backtick 명령의 프로세스 : 상태를 반환합니다.

그러나 Daniel Pittman은 FileTest와 같은 것을 사용하여 실행 파일이 사용 가능한지 확인하는 것이 더 쉽습니다. 그러나 좀더 복잡한 다른 오류가 발생할 경우에 대비하여 반환 값의 테스트와이를 결합하려고합니다.

+0

그래,하지만 어떻게 다니엘 피트 만의 솔루션으로 프로그램을 종료 할 수 있습니까? Process.exit? – Simon

+1

Daniel의 제안을 따르면 루비이므로 exit (-1)를 호출하거나 실행 파일을 사용할 수 없다는 것을 알게되면 원하는 오류 코드를 호출합니다. –

2

그 작업을 수행하는 더 나은 방법은 다음과 같습니다

ENV["PATH"].split(':').any? {|x| FileTest.executable? "#{x}/spark" } 

시즌 전체 경로를 받고, 또는 경로 또는 플랫폼 경로 분리, 또는 무엇이든을 구축 File.join을 사용하는 맛.