ruby系统命令检查退出代码

我在ruby中有一堆系统调用,比如下面的代码,我想同时检查它们的退出代码,这样如果这个命令失败,我的脚本就会退出。

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 ,非零退出状态为false 。 如果命令执行失败,则返回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 

如果该命令具有非零的退出代码,则system返回false如果没有命令,则返回零。

因此

 system( "foo" ) or exit 

要么

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

应该工作,而且是相当简洁的。

对我而言,我更喜欢使用“来调用shell命令并检查$? 获取进程状态。 $? 是一个进程状态对象,你可以从这个对象获取命令的进程信息,包括:状态码,执行状态,pid等

一些有用的方法$? 目的:

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

你没有捕获你的system调用的结果,这是返回结果代码的地方:

 exit_code = system("ruby test.rb") 

记住每个system调用或者包括backtick方法在内的等价物都会生成一个新的shell,所以不可能捕获到以前的shell环境的结果。 在这种情况下,如果一切正常,则exit_codetrue ,否则nil

popen3命令提供了更多的低级细节。

一种方法是使用and或者将它们链接起来:

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

如果第一次失败,第二次调用将不会运行。

你可以把它们封装在一个if ()来给你一些stream量控制:

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