Programing

루비 시스템 명령 확인 종료 코드

lottogame 2020. 8. 17. 09:31
반응형

루비 시스템 명령 확인 종료 코드


다음과 같은 루비에서 많은 시스템 호출이 있으며 해당 명령이 실패하면 스크립트가 종료되도록 종료 코드를 동시에 확인하고 싶습니다.

system("VBoxManage createvm --name test1")
system("ruby test.rb")

나는 같은 것을 원한다

system("VBoxManage createvm --name test1", 0) <-여기서 두 번째 매개 변수는 종료 코드를 확인하고 시스템 호출이 성공했는지 확인합니다. 그렇지 않으면 오류가 발생하거나 그런 종류의 작업을 수행합니다.

그게 가능할까요?

나는 이것의 라인을 따라 무언가를 시도했지만 그것도 작동하지 않았습니다.

system("ruby test.rb")
system("echo $?")

또는

`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
  raise 'Exit code is not zero'
end

로부터 문서 :

true0이 아닌 종료 상태에 false대해 명령이 0 종료 상태를 제공하면 시스템이 리턴 합니다 . nil명령 실행이 실패하면 반환 합니다.

system("unknown command")     #=> nil
system("echo foo")            #=> true
system("echo foo | grep bar") #=> false

더욱이

에서 오류 상태를 확인할 수 있습니다 $?.

system("VBoxManage createvm --invalid-option")

$?             #=> #<Process::Status: pid 9926 exit 2>
$?.exitstatus  #=> 2

저에게는``를 사용하여 쉘 명령을 호출하고 $? 프로세스 상태를 가져옵니다. $? 프로세스 상태 객체이며, 상태 코드, 실행 상태, pid 등을 포함하여이 객체에서 명령의 프로세스 정보를 가져올 수 있습니다.

$의 몇 가지 유용한 방법? 목적:

   $?.exitstatus => return error code    
   $?.success? => return true if error code is 0, otherwise false
   $?.pid => created process pid

systemfalse명령에 0이 아닌 종료 코드가 있거나 nil명령이없는 경우를 반환 합니다 .

따라서

system( "foo" ) or exit

또는

system( "foo" ) or raise "Something went wrong with foo"

작동해야하며 합리적으로 간결합니다.


system결과 코드가 반환되는 호출 결과를 캡처하지 않습니다 .

exit_code = system("ruby test.rb")

systembacktick-method를 포함하는 호출 또는 동등한 기능은 새 셸을 생성하므로 이전 셸 환경의 결과를 캡처 할 수 없습니다. 이 경우 exit_code에는 true모든 것이 잘 풀 렸고 nil그렇지 않은 경우입니다.

popen3명령은 더 낮은 수준의 세부 정보를 제공합니다.


이를 수행하는 한 가지 방법은 and또는 사용하여 연결하는 것입니다 &&.

system("VBoxManage createvm --name test1") and system("ruby test.rb")

첫 번째 호출이 실패하면 두 번째 호출이 실행되지 않습니다.

if ()흐름 제어를 제공하기 위해로 래핑 할 수 있습니다 .

if (
  system("VBoxManage createvm --name test1") && 
  system("ruby test.rb")
) 
  # do something
else
  # do something with $?
end

참고 URL : https://stackoverflow.com/questions/18728069/ruby-system-command-check-exit-code

반응형