ruby系统命令检查退出代码
我在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 或 应该可以工作,并且相
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