我在 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
如果命令给出零退出状态,则系统返回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
对我来说,我更喜欢使用 '' 来调用 shell 命令并检查 $?以获取进程状态。$?是一个进程状态对象,您可以从此对象获取命令的进程信息,包括:状态代码,执行状态,pid 等。
$?对象的一些有用的方法:
$?.exitstatus => return error code
$?.success? => return true if error code is 0, otherwise false
$?.pid => created process pid
system
如果命令具有非零退出代码,则返回false
;如果没有命令,则返回nil
。
因此
system( "foo" ) or exit
或
system( "foo" ) or raise "Something went wrong with foo"
应该工作,并且相当简洁。
您没有捕获system
调用的结果,这是返回结果代码的位置:
exit_code = system("ruby test.rb")
请记住,每个system
调用或等效调用(包括 backtick-method)都会生成一个新的 shell,因此无法捕获以前的 shell 环境的结果。在这种情况下,如果一切正常,则exit_code
为true
,否则为nil
。
popen3
命令提供更多低级详细信息。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(33条)