2011-01-24 3 views
7

Ruby 스크립트에서 "명령을 찾을 수 없음"오류를 캡처하는 방법이 있습니까? 예를 들어, 주어진 :Ruby의 백틱에서 '명령을 찾을 수 없음'오류를 캡처합니까?

output = `foo` 

어떻게 트랩 foo가 설치되어 있지 않은 상황합니까? 나는 rescue을 예외로 할 수 있다고 예상했으나 1.8.7에서는 작동하지 않습니다. 원하는대로 할 수있는 하위 프로세스를 호출하는 다른 방법이 있습니까? 아니면 다른 접근법이 있습니까?

나의 사과

업데이트, 나는 숨겨진 요구 사항을 언급하는 것을 잊었다 : 나는 인터프리터 따라서 이유를 제외하고, (민감한 데이터를 포함 할 수 있습니다) 사용자에게 명령 줄을 누설하지 않는 것을 선호 포착 방법이 선호된다. 이 문제를 처음부터 해결해 준 것에 대해 사과드립니다.

+0

한 전술을,이다 코드를 실행하려고하기 전에 프리 플라이트 확인을 실행하거나 기능 또는 앱을 찾거나 코드를 먼저 작성해야합니다. ''foo''라고 말하거나 파일 테스트에서 파일의 존재 여부와 실행 파일을 찾는 것은 실제로 명령을 시도하지 않고 계속 진행하는 것이 안전한지 여부를 알려줍니다. 누락 된 기능에 대한 대응 방법을 제어하고 대체 경로로 이동하거나 누락 된 항목이있어 사용자가 진행할 수 없음을 알릴 수 있으므로 사용자 환경이 개선됩니다. –

+0

동의하지만''foo''는 크로스 플랫폼이 아니며, 크로스 플랫폼 방식으로 시도하고 에러를 잡는 것 외의 다른 방법을 생각할 수 없었습니다 ... – kfb

답변

13

반환 코드를 사용하십시오!

irb(main):001:0> `date` 
=> "Mo 24. Jan 16:07:15 CET 2011\n" 
irb(main):002:0> $? 
=> #<Process::Status: pid=11556,exited(0)> 
irb(main):003:0> $?.to_i 
=> 0 
irb(main):004:0> `foo` 
(irb):4: command not found: foo 
=> "" 
irb(main):005:0> $?.to_i 
=> 32512 

http://corelib.rubyonrails.org/classes/Process/Status.html이 가 STDOUT에

재 지정 STDERR는 그냥 그것을 복부 팽만 당신에게 반환 값으로 출력을 대신 줄 것이다

: 특정 기능을 필요로 할 때 유용합니다

irb(main):010:0> `foo 2>&1` 
=> "sh: foo: not found\n" 
irb(main):011:0> $?.to_i 
=> 32512 
+0

고마워! 그러나 커맨드 라인을 다시 유출하지 않는 추가 요구 사항을 언급하는 것을 잊었습니다. 만약 내가 정확하게 이해가 아직 사용자에게 메시지를 찾을 수 없습니다 명령을 표시합니다. – kfb

+0

내 답변에이 작업을 수행하는 방법에 대한 예제가 추가되었습니다. –

+0

매력처럼 작동합니다! 감사! – kfb

관련 문제