我在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
7条答案
按热度按时间c86crjj01#
来自文档:
如果命令给出零退出状态,则系统返回
true
,如果命令给出非零退出状态,则返回false
。如果命令执行失败,返回nil
。此外
错误状态在
$?
中可用。qzwqbdag2#
对我来说,我更喜欢使用``来调用shell命令并检查$?获取进程状态。$?是一个进程状态对象,你可以从这个对象中获取命令的进程信息,包括:状态代码、执行状态、PID等。
一些有用的方法的$?对象:
mcdcgff03#
system
返回false
,如果命令有非零的退出代码,或者nil
,如果没有命令。因此
或
应该工作,并合理简洁。
xzv2uavs4#
您没有捕获
system
调用的结果,这是返回结果代码的地方:请记住,每个
system
调用或等效调用(包括backtick-method)都会产生一个新的shell,因此不可能捕获前一个shell环境的结果。在这种情况下,如果一切顺利,exit_code
是true
,否则是nil
。popen3
命令提供了更低级别的详细信息。v64noz0r5#
一种方法是使用
and
或&&
链接它们:如果第一个调用失败,则不会运行第二个调用。
您可以将它们 Package 在
if ()
中,以给予一些流控制:wlwcrazw6#
Ruby 2.6 added option to raise exception in Kernel#system:
rggaifut7#
我想要的是
system("VBoxManage createvm --name test1", 0)
<--其中第二个参数检查退出代码并确认系统调用是否成功,如果没有,它将引发错误或执行类似操作。您可以将
exception: true
添加到system
调用中,以便在非0退出代码时引发错误。例如,考虑
system
周围的这个小 Package 器,它打印命令(类似于bash -x
,如果有非0的退出代码(如bash -e
)则失败并返回实际的退出代码:被称为:
sys("hg", "update")
如果要调用使用不同退出代码约定的程序,可以禁止引发异常:您还可以抑制噪声程序的stdout和stderr: