다음과 같은 루비에서 많은 시스템 호출이 있으며 해당 명령이 실패하면 스크립트가 종료되도록 종료 코드를 동시에 확인하고 싶습니다.
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
답변
로부터 문서 :
true
0이 아닌 종료 상태에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
답변
system
false
명령에 0이 아닌 종료 코드가 있거나 nil
명령이없는 경우를 반환 합니다 .
따라서
system( "foo" ) or exit
또는
system( "foo" ) or raise "Something went wrong with foo"
작동해야하며 합리적으로 간결합니다.
답변
system
결과 코드가 반환되는 호출 결과를 캡처하지 않습니다 .
exit_code = system("ruby test.rb")
system
backtick-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
답변
