2

説明できないRubyの奇妙な問題に遭遇しました。次のスクリプトがあります。このスクリプトは、現在クリップボードにあるコードを取得し、構文ハイライトを実行してから、新しいバージョンをクリップボードに戻します。

#!/usr/bin/ruby1.9.1

require 'coderay'

language = "auto";
if(ARGV.length > 0)
    language = ARGV[0];
end

print("Using language: #{language} \n");

codeToHighlight = `xsel --clipboard`

highlightedCode = CodeRay.scan(codeToHighlight, language.intern()).div

IO.popen("xsel --clipboard", mode='w') do |io|
  io.write highlightedCode
  io.flush
end

奇妙な部分は、ターミナル内で直接実行すると、正常に動作することです。ただし、「xterm -e」で実行すると、機能しません。同じ質問をした別のサイトでこのスレッドを見つけましたが、その人は答えを得ることができませんでした:http: //blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/138423

その人は、スクリプトの最後に一時停止を追加すると、次のようになります...

10000.times do
   puts ""
end

...できます。どうしてこれなの?これを修正する方法はありますか?popenがIOオブジェクトを返し、手動でcloseを呼び出せるようにスクリプトを書き直してみましたが、違いはありません。

4

1 に答える 1

1

xterm-eの代わりにgnome-terminal-eを使用して実行するとどうでしょうか。

アップデート:

OK、これが私の最善の推測です。&ターミナルプログラムをバックグラウンドに送信し(コマンドの後またはを使用してctl-z)、ターミナルを閉じると、プログラムが強制終了されることをご存知ですか?xselは、クリップボードに書き込むための子プロセスをフォークしますが、rubyラッパースクリプトが終了してxtermが閉じると、子プロセスが強制終了される必要があります。

これは、最後の一時停止によって機能する理由を説明します。これは、端末が終了する前に子プロセスが終了するのに十分な時間を与えるだけです。また、手動で実行した場合に機能する理由についても説明します。子プロセスが終了するのに十分な時間、ターミナルを開いたままにしておきます。

-nxselコマンドにオプションを 追加してみてください。うまくいくと思います。-nxselがフォークしないようにします。

于 2011-05-07T03:18:59.500 に答える