【问题标题】:"ruby script.rb" versus "xterm -e ruby script.rb"“ruby script.rb”与“xterm -e ruby​​ script.rb”
【发布时间】:2010-10-06 21:55:11
【问题描述】:

我在使用 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,但这并没有什么不同。

【问题讨论】:

  • 我已经确定,无论问题是什么,它都在 xsel 中。我尝试在文件末尾添加一行(没有疯狂的 puts "" 循环),它只是将突出显示的代码转储到文件中,无论 如何 我运行脚本,它的内容都是正确的。我尝试使用 xclip ,它似乎可以在更多情况下工作,尽管我只使用过主要(又名中键)剪贴板来使用它。当从另一个 xsel 不能的脚本调用时,xclip 可以工作,但 xclip 仍然不能通过 xterm -e 工作。

标签: ruby xterm


【解决方案1】:

如果你用 gnome-terminal -e 而不是 xterm -e 来执行呢?

更新:

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

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

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

【讨论】:

  • 不,这似乎也不起作用...与 xclip 与 xsel。不过还是谢谢。我很少再使用这个脚本了,所以这没什么大不了的,但很高兴知道它为什么这样做只是为了了解。
  • 啊,糟了。我的想法可能是终端模拟器的问题,也许您在手动运行时打开了 gnome-terminal。
  • 对不起,我花了这么长时间才接受这个。我已经很长时间没有使用该脚本了,所以我确实注意到您已经更新了答案。我现在无法复制它(所有内容的不同版本,对吗?)所以我会继续接受,因为您的回答对行为有有效的解释。
  • 啊伙计,现在我希望我能确定我是否正确。哦,好的,谢谢你的接受!
  • 我知道,对吧?对于那个很抱歉。不过,我真的很感谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2012-06-06
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多