gpt4 book ai didi

ruby - "ruby script.rb"与 "xterm -e ruby script.rb"

转载 作者:太空宇宙 更新时间:2023-11-03 16:38:24 27 4
gpt4 key购买 nike

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

最佳答案

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

更新:

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

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

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

关于ruby - "ruby script.rb"与 "xterm -e ruby script.rb",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877195/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com