2010-10-06 41 views
2

我遇到了Ruby無法解釋的奇怪問題。我有以下腳本,抓住任何代碼目前在剪貼板上,運行它通過一個語法高亮,然後把新版本返回到剪貼板:「ruby script.rb」與「xterm -e ruby​​ script.rb」

#!/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

我已經確定,無論問題是在xsel中。我試着在文件末尾添加一行(沒有瘋狂的puts「」循環),只是將突出顯示的代碼轉儲到一個文件中,而且無論運行腳本如何,它的內容都是正確的。我嘗試了xclip,它似乎可以在更多情況下工作,儘管我只能獲得主要(即中間單擊)剪貼板來處理它。當從另一個腳本調用xclip時xclip不起作用,但xclip仍然無法通過xterm -e工作。 – Matthew 2011-02-23 14:14:12

回答

1

如果使用gnome-terminal -e而不是xterm -e執行它,那麼該怎麼辦?

UPDATE:

OK,這裏是我最好的猜測。你知道如果你發送一個終端程序到後臺(使用命令後的&ctl-z),然後關閉終端,它會殺死程序,對吧?好吧,xsel會派生一個子進程來寫入剪貼板,但是當ruby包裝腳本完成並且xterm關閉時它必須被殺死。

這將解釋爲什麼最後的暫停允許它工作 - 它只是給子進程提供足夠的時間在終端退出前完成。它還解釋了爲什麼它在手動運行時工作 - 您將終端打開足夠長的時間,以便完成子進程。

嘗試將-n選項添加到您的xsel命令,我敢打賭它的工作原理。 -n使xsel保持分叉狀態。

+0

不,看起來沒有用xclip或xsel。不過謝謝你。我很少再使用這個腳本,所以它沒有什麼大不了的,但知道它爲什麼這麼做只是爲了知道。 – Matthew 2011-05-09 13:09:35

+0

啊,夾子。我的想法可能是終端模擬器出現問題,當手動運行時,_maybe_打開gnome-terminal。 – James 2011-05-10 16:07:31

+0

我更新了我的答案,因爲我剛剛有一個頓悟。 – James 2011-05-10 16:31:35