饥荒黄宝石代码:红宝石系统命令检查退出代码

我在 ruby 中有一堆系统调用,如下所示,我想同时检查它们的退出代码,以便如果该命令失败,我的脚本退出。

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

我想要像

system("VBoxManage createvm --name test1", 0)& lt;-其中第二个参数检查退出代码并确认系统调用成功,如果不成功,它将引发错误或执行类似的操作。

有可能吗?

我已经尝试了一些这方面的东西,但也没有奏效。

system("ruby test.rb")
system("echo $?")

`ruby test.rb`
exit_code = `echo $?`
if exit_code != 0
  raise 'Exit code is not zero'
end
184

documentation

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

system("unknown command")     #=> nil
system("echo foo")            #=> true
system("echo foo | grep bar") #=> false

Furthermore

错误状态在$?中可用。

system("VBoxManage createvm --invalid-option")
$?             #=> #<Process::Status: pid 9926 exit 2>
$?.exitstatus  #=> 2
47

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

$?对象的一些有用的方法:

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

system如果命令具有非零退出代码,则返回false;如果没有命令,则返回nil

因此

system( "foo" ) or exit

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

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

6

您没有捕获system调用的结果,这是返回结果代码的位置:

exit_code = system("ruby test.rb")

请记住,每个system调用或等效调用(包括 backtick-method)都会生成一个新的 shell,因此无法捕获以前的 shell 环境的结果。在这种情况下,如果一切正常,则exit_codetrue,否则为nil

popen3命令提供更多低级详细信息。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(57)
数据库防护与审计产品:审计日志的数据库设计(database audit log)
上一篇
Oracle数据库接口:使用DataSource接口连接Oracle数据库的程序
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(33条)