У меня возникла странная проблема с 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 возвращал объект ввода-вывода, и я мог вручную вызывать close, но это не имеет значения.