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サブシェルで指定されたコマンドを実行します。つまり、Ctrl-C は 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 に答える