1

我有这个程序:

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

4

2 回答 2

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
于 2012-10-31T10:41:19.200 回答
1

由于该system命令调用的程序获得了中断,因此程序(在本例中为sleep)退出。但是 ruby​​ 解释器没有收到中断,它不会退出。

但是如果你检查system方法调用的返回值,你可以检测到你正在调用的程序的退出代码的值。因此以下代码有效。

5.times do |i|
  puts "Iteration #{i}"
  unless system("sleep 3")
    puts "Got an interupt?"
    exit 0
  end
end

检查Module: Kernel 中的系统方法参考

于 2012-10-31T10:41:34.227 回答