在Ruby中使用system()时,Ctrl-C不退出程序

时间:2012-10-31 10:33:35

标签: ruby

我有这个程序:

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退出执行?

2 个答案:

答案 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

检查system method reference in Module: Kernel