Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
&引用;ruby script.rb";对;xterm-e ruby script.rb“;_Ruby_Xterm - Fatal编程技术网

&引用;ruby script.rb";对;xterm-e ruby script.rb“;

&引用;ruby script.rb";对;xterm-e ruby script.rb“;,ruby,xterm,Ruby,Xterm,我在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 --c

我在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”运行它,它就不工作了。我在另一个问同样问题的网站上发现了这条线索,但此人从未得到答案:

那个人发现如果他们在脚本末尾加了一个停顿,就像这样

10000.times do
   puts ""
end

…它起作用了。为什么会这样?有办法解决这个问题吗?我尝试重写脚本,以便popen返回一个IO对象,我可以手动调用close,但这没有什么区别。

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

更新:

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

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


尝试将
-n
选项添加到您的xsel命令中,我敢打赌它会起作用<代码>-n防止xsel分叉。

我已经确定,不管问题是什么,都在xsel中。我尝试在文件末尾添加一行(没有疯狂的puts“”循环),它只是将突出显示的代码转储到文件中,无论我如何运行脚本,它的内容都是正确的。我尝试了xclip,但它似乎在更多情况下都能工作,尽管我只使用过主剪贴板(也就是鼠标中键单击)来使用它。当从另一个脚本调用xclip时xclip可以工作,而xsel则不能,但是xclip仍然不能通过xterm-e工作。不,这似乎也不能用xclip或xsel工作。不过还是谢谢你。我很少再使用这个脚本了,所以没什么大不了的,但我很高兴知道它为什么这么做只是为了知道。啊,嘘。我的想法是,这可能是终端仿真器的问题,可能是您在手动运行gnome终端时打开了gnome终端。很抱歉,我花了这么长时间才接受这一点。我很久没有使用脚本了,所以我注意到你已经更新了答案。我现在不能复制它(每件事都有不同的版本,对吗?),所以我会接受你的回答,因为你的回答对这种行为有一个有效的解释。啊,伙计,现在我希望我能确定我是否正确。哦,谢谢你的接受!我知道,对吧?很抱歉。不过,我真的很感谢你的帮助。