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_code
为true
,否则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