Mam kilka wywołań systemowych w Rubim, takich jak poniższe, i chcę jednocześnie sprawdzić ich kody zakończenia, aby mój skrypt zakończył działanie, jeśli to polecenie zawiedzie.
system("VBoxManage createvm --name test1")
system("ruby test.rb")
Chcę czegoś takiego
system("VBoxManage createvm --name test1", 0)
<- gdzie drugi parametr sprawdza kod zakończenia i potwierdza, że wywołanie systemowe się powiodło, a jeśli nie, spowoduje zgłoszenie błędu lub zrobi coś podobnego.
Czy to w ogóle możliwe?
Próbowałem czegoś podobnego do tego i to też nie zadziałało.
system("ruby test.rb")
system("echo $?")
lub
`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
raise 'Exit code is not zero'
end
exit_code
będzie ciągiem - albo"0\n"
albo"1\n"
, więcexit_code != 0
zawsze będzie prawdziweOdpowiedzi:
Z dokumentacji :
Ponadto
źródło
[10] pry(main)> system("touch /root/test 2> /dev/null") => false [11] pry(main)> $?.exitstatus => 0 [12] pry(main)> system("touch /root/test 2> /dev/null"); $?.exitstatus => 1
system
odwrotnych apostrofów%x
iexec
podane tutaj: stackoverflow.com/questions/6338908/ ...Dla mnie wolałem używać ``, aby wywołać polecenia powłoki i sprawdzić $? aby uzyskać status procesu. $? jest obiektem statusu procesu, możesz pobrać informacje o procesie polecenia z tego obiektu, w tym: kod statusu, status wykonania, pid itp.
Niektóre przydatne metody $? obiekt:
źródło
$?
to$CHILD_STATUS
system
zwraca,false
jeśli polecenie ma niezerowy kod zakończenia lubnil
jeśli nie ma polecenia.W związku z tym
lub
powinny działać i są dość zwięzłe.
źródło
Nie przechwytujesz wyniku
system
połączenia, czyli miejsca, w którym zwracany jest kod wyniku:Pamiętaj, że każde
system
wywołanie lub odpowiednik, który zawiera metodę backtick, powoduje powstanie nowej powłoki, więc nie jest możliwe przechwycenie wyniku środowiska poprzedniej powłoki. W tym przypadkuexit_code
jest,true
jeśli wszystko się udało, wnil
przeciwnym razie.popen3
Poleceń dostarcza więcej szczegółów na niskim poziomie.źródło
Open3.capture3
to szczególnie łatwa metoda do tego rodzaju zadań.Jednym ze sposobów jest połączenie ich w łańcuch za pomocą
and
lub&&
:Drugie wywołanie nie zostanie uruchomione, jeśli pierwsze się nie powiedzie.
Możesz opakować je w an,
if ()
aby uzyskać pewną kontrolę przepływu:źródło