説明できない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を呼び出せるようにスクリプトを書き直してみましたが、違いはありません。