如何在命令行脚本中中断循环,但仅在方法完成后?

时间:2012-03-09 17:18:04

标签: ruby

我有一个类似于:

的Ruby脚本
def big_function
  puts "starting..."
  #does stuff
  puts "done"
end

loop do
  big_function
end

无限期运行,执行big_function

我需要一种方法让用户中断正在运行的脚本,但绝不会在big_function的中间。如果在big_function运行时它被中断,则应在big_function完成时退出。

2 个答案:

答案 0 :(得分:5)

Trap这样做:

interrupted = false
trap("INT") { interrupted = true } # traps Ctrl-C
puts 'Press Ctrl-C to exit'

def big_function
  puts "starting..."
  sleep 1
  puts "done"
end

until interrupted do
  big_function
end

答案 1 :(得分:2)

你可以使用旗帜。您可以在用户的​​键触发中进行单独的进程轮询,如果他单击或按下标记更改状态的键。您必须在退出前检查标志。

flag = false

t = Thread.new() {
  loop do
    flag = gets
    break if flag
  end
}

def big_function
  puts "starting..."
  #does stuff
  puts "done"
end

loop do
  break if flag
  big_function
end