"ruby script.rb" против "xterm -e ruby ​​script.rb" - PullRequest
2 голосов
/ 07 октября 2010

У меня возникла странная проблема с Ruby, которую я не могу объяснить.У меня есть следующий скрипт, который захватывает любой код, который в данный момент находится в буфере обмена, запускает его с помощью подсветки синтаксиса, а затем помещает новую версию BACK в буфер обмена:

#!/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, но это не имеет значения.

1 Ответ

1 голос
/ 07 мая 2011

Как насчет того, чтобы выполнить его с помощью gnome-terminal -e вместо xterm -e?

ОБНОВЛЕНИЕ:

ОК, вот мое лучшее предположение.Вы знаете, как, если вы отправляете программу терминала в фоновом режиме (либо с помощью & после команды, либо с помощью ctl-z), а затем закрываете терминал, это убивает программу, верно?Что ж, xsel разветвляет дочерний процесс для записи в буфер обмена, но он должен быть убит, когда сценарий оболочки ruby ​​завершается, а xterm закрывается.

Это объясняет, почему пауза в конце позволяет ему работать -он просто дает достаточно времени для завершения дочернего процесса до завершения работы терминала.Это также объясняет, почему он работает при запуске вручную - вы оставляете терминал открытым достаточно долго, чтобы завершить дочерний процесс.

Попробуйте добавить опцию -n в команду xsel, и я уверен, что она работает.-n удерживает xsel от разветвления.

...