“ruby script.rb”与“xterm -e ruby​​ script.rb”

时间:2010-10-06 21:55:12

标签: ruby xterm

我遇到了一个我无法解释的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 个答案:

答案 0 :(得分:1)

如果用gnome-terminal -e而不是xterm -e执行它怎么样?

<强>更新

好的,这是我最好的猜测。您知道如何将终端程序发送到后台(在命令后使用&或使用ctl-z),然后关闭终端程序,它会终止程序,对吗?好吧,xsel分叉子进程写入剪贴板,但是当ruby包装器脚本完成并且xterm关闭时它必须被杀死。

这就解释了为什么最后的暂停允许它工作 - 它只是给终端退出之前子进程完成的足够时间。它还解释了为什么它在手动运行时有效 - 您将终端打开足够长的时间以便子进程完成。

尝试将-n选项添加到xsel命令,我敢打赌它有效。 -n让xsel不会分叉。