我有这个程序:
5.times do |i|
puts "Iteration #{i}"
system("sleep 3")
end
我想退出这个程序,比如说2次迭代,我们Ctrl-C
如果我点击Ctrl-C
,就会发生这种情况:
➜ tmp ruby system.rb
Iteration 0
^CIteration 1
^CIteration 2
^CIteration 3
^CIteration 4
^C%
system()
命令运行5次,无论如何。
我可以做什么,以便我可以使用Ctrl-C
退出执行?
答案 0 :(得分:3)
Kernel#system
在子shell中执行给定命令。这意味着Ctrl-C将转到子shell而不是ruby脚本,所以没有用它来捕获它。但是,该命令返回一个值,该值指示是否已成功完成。当命令通过Ctrl-C停止时,它不会被视为成功完成。所以,检查返回值。
5.times do |i|
puts "Iteration #{i}"
success = system("sleep 3")
break unless success
end
答案 1 :(得分:1)
由于system
命令调用的程序获得中断,程序(在本例中为sleep
)退出。但ruby解释器没有收到中断,它不会退出。
但是如果检查system
方法调用的返回值,则可以检测正在调用的程序的退出代码的值。因此,下面的代码可以工作。
5.times do |i|
puts "Iteration #{i}"
unless system("sleep 3")
puts "Got an interupt?"
exit 0
end
end