ruby系统命令检查退出代码

ruby系统命令检查退出代码,ruby,command,exit,exit-code,Ruby,Command,Exit,Exit Code,我在ruby中有很多系统调用,比如下面的,我想同时检查它们的退出代码,以便在命令失败时退出脚本 system("VBoxManage createvm --name test1") system("ruby test.rb") 我想要像这样的东西 system(“VBoxManage createvm--name test1”,0)system如果命令具有非零退出代码,则返回false,如果没有命令,则返回nil 所以 system( "foo" ) or exit 或 应该可以工作,并且相

我在ruby中有很多系统调用,比如下面的,我想同时检查它们的退出代码,以便在命令失败时退出脚本

system("VBoxManage createvm --name test1")
system("ruby test.rb")
我想要像这样的东西


system(“VBoxManage createvm--name test1”,0)
system
如果命令具有非零退出代码,则返回
false
,如果没有命令,则返回
nil

所以

system( "foo" ) or exit


应该可以工作,并且相当简洁。

您没有捕获
系统
调用的结果,这是返回结果代码的地方:

exit_code = system("ruby test.rb")
请记住,每个
系统
调用或等效调用(包括backtick方法)都会生成一个新的shell,因此无法捕获以前shell环境的结果。在这种情况下,
exit\u code
true
如果一切正常,则
nil

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

来自:

如果命令给出零退出状态,系统返回
true
,对于 非零退出状态。如果命令执行失败,则返回
nil

此外

错误状态在
$?
中可用

system(“VBoxManage createvm——无效选项”)
$?             #=> #
$?.exitstatus#=>2

一种方法是使用
&
链接它们:

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

对我来说,我更喜欢使用``来调用shell命令并检查$?获取进程状态。美元?是一个进程状态对象,您可以从该对象获取命令的进程信息,包括:状态代码、执行状态、pid等

美元的一些有用方法?对象:

   $?.exitstatus => return error code    
   $?.success? => return true if error code is 0, otherwise false
   $?.pid => created process pid
我想要像这样的东西

system(“VBoxManage createvm——名称test1”,0)
File::NULL,:err=>File::NULL)
在上述示例中,
exit\u code
可能是一个字符串-要么
“0\n”
要么
“1\n”
,因此
exit\u code!=0
将始终为真是一种特别容易用于此类任务的方法。如何将其输出(而不是退出代码)捕获到变量?如果您在rails控制台中测试,请记住您可能会丢失$的值?因此,您需要将其捕获为REPL命令
[10]pry(main)>系统的一部分(“touch/root/test 2>/dev/null”)=>false[11]pry(main)>$?。exitstatus=>0[12]pry(main)>系统(“touch/root/test 2>/dev/null”);$?。exitstatus=>1
这里提供了另一个关于
系统
、反勾号、
%x
exec
的优秀比较:这是我目前想要实现的,非常简单明了。感谢您在Rubocop的帮助下,我发现
$?
的可读别名是
$CHILD\u STATUS
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("VBoxManage createvm --name test1") and system("ruby test.rb")
if (
  system("VBoxManage createvm --name test1") && 
  system("ruby test.rb")
) 
  # do something
else
  # do something with $?
end
   $?.exitstatus => return error code    
   $?.success? => return true if error code is 0, otherwise false
   $?.pid => created process pid