2016-12-20 2 views
2

私は長時間実行しているRubyスクリプトを持っています。ユーザーがCTRL-Cを押したときに^ Cが表示されないようにするにはどうすればよいですか?Rubyスクリプトを停止するときに^ Cが表示されないようにするにはどうすればいいですか?

trap 'SIGINT' do 
    puts "SIGINT received. Exiting." 
    exit 
end 

loop do 
    ... 
end 

私は"\b\bSIGINT..."作品を置いたが、それはハックのように感じています。

答えて

2

あなたはfalseIO#echo=を設定することでこれを防ぐことができます。

require 'io/console' 

STDIN.echo = false 
1

あなたには、いくつかの出力オーバー踏みつけるする場合:

puts "\rSIGINT" 

\r文字は現在の行の先頭にカーソルを移動します。

+0

それはカーソル二つの場所を移動しないことを除いて、これは、実際には '\ bは\のbSIGINT'を使用してからの違いはありません'^ C'が押されたときにスクリプトが何かを出力していた場合には必ずしも動作しないかもしれません。 – Carpetsmoker

+0

これはいつもうまくいくわけではない異なるアプローチですが、ほとんどの場合、適切です。 – tadman

5

^Cを印刷するのは「Ruby」ではなく、端末からの通常のキーボード入力です。 asdと入力すると、と表示されます。ターミナルでは、本当に単なる文字(または複数の文字)なので、すべての「特別な」キー(Ctrl +キー、Alt +キー、F1など)は本当にすべて「特別な」ものではないからです。

あなたのスクリプトを実行し、F1(私のシステムで^[OPとして番組)のようないくつかのキーを押すことによって自分自身のためにこれを見ることができ、バックスペース(^Hまたは^?)など

それはどこ、1960年代のテレタイプからレガシーですすべてのデータは単一のシリアルテキスト接続を介して送信されました。この修正するいくつかの方法があります

:tadmanは、すでに述べたように

  • が、あなたは、行の先頭にカーソルを置く\r文字を使用することができます。実際には何も消去しませんが、^Cを別のもので上書きすることができます。 ^Cではなく、が新しい行に印刷されるため、すべての場合に機能するとは限りません。あなたのputs "\b\bSIGINT"はおそらくこれのためのより良い解決策です!また、唯一の制御文字(例えば、^Cのエコー防止ctlechoオプションをサポート(Linuxなど)

    いくつかのシステム:

  • 第二の方法は、エコー入力を防止するためにsttyコマンドを使用することです)。

関連する問題