2012-03-28 21 views
0

我一直在試圖讓ruby腳本通過Java運行的真正問題。我已經提出了各種解決方案,並且由於某種原因它們都失敗了,所以我試圖簡化我的問題。從shell/Terminal調用腳本並使用Java進程有什麼區別?

比方說,我有一個shell腳本,只是有這一行是:

ruby -rubygems script/test_s2t.rb 

在終端,我可以運行使用script/runruby.sh這個腳本,它按預期工作。現在,讓我們說我有一個Java方法執行以下操作:

String[] cmd = {"script/runruby.sh"}; 
ProcessBuilder builder = new ProcessBuilder(cmd); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 

這不工作(它拋出一個錯誤從Ruby腳本回來,具體地講,但是這是一個誤導,因爲它是真正下到腳本本身沒有按預期工作)。我的問題不是爲什麼這個test_s2t.rb腳本不起作用,因爲我認爲這可能會讓我從真正的問題中分心。

我的問題很簡單當我通過ProcessBuilder運行某些東西而不是通過命令行運行時,有什麼不同。這是一個權限的東西嗎?路徑差異?腳本運行的環境必須有一些東西,因爲我看不到腳本本身的問題。

作爲alwyas,任何建議表示讚賞。三天指望這個問題...

編輯 - 對於那些好奇,我收到的Java確切的錯誤是在這個問題的底部描述的:Java receives an error executing Ruby script; Terminal doesn't

我們在這個問題得到的結果是我應該嘗試JRuby,但是這導致了更多的問題,因爲我無法在JRuby中正確使用這些寶石。所以我回過頭來問自己爲什麼它不會正常運行。

我認爲錯誤是一個分心的原因是因爲錯誤是由於它處理了一個字符串,它不期望看到。它期望的字符串是腳本運行的正常進程,它使用ffmpeg和suchlike。這意味着腳本遇到了另一個錯誤(它沒有顯示,這意味着它可能不是由ruby/jruby引起的,而是由腳本啓動的過程如ffmpeg引起的)。

這令人難以置信的令人沮喪,純粹是因爲它從命令行運行得非常完美。

+0

雖然這可能會讓您對真實問題感到分心,但您從腳本中獲得的錯誤是什麼? ProcessBuilder在自己的*相同*環境中執行進程 – ArjunShankar 2012-03-28 14:04:32

+0

我將在錯誤和一些解釋中進行編輯。完成。 – mtrc 2012-03-28 14:21:30

回答

2

我碰到類似的問題,有兩件事情,似乎是共同的問題:

1)子進程的環境將是相同作爲當前虛擬機的環境。這包括已啓動進程的工作目錄。

來自實例:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html

Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory("myDir"); 

或者,你可以設置shell腳本里面的環境。

2)你有沒有合適的shebang#!在.sh文件的開頭?就個人而言,我會把它弄清楚,也許明確地調用bash或zsh或其他任何與shell腳本的路徑作爲第一個參數,或者直接使用'-rubygems'和'script/test_s2t.rb'作爲參數來調用ruby。

祝你好運!

+0

感謝這些 - 明天將嘗試它們並回饋給您! – mtrc 2012-03-28 22:13:09

+0

關於第二個建議 - 我實際上將這個ruby調用轉換成腳本,這樣我就可以簡化問題,以前我試圖直接調用Ruby,但沒有骰子。所以我不認爲是這樣。我會調查當地的環境。工作目錄很好,但也許一些變量沒有設置... – mtrc 2012-03-28 23:03:11

+1

你是美麗的WO/MAN。天啊。我無法相信這是行得通的。 ProcessBuilder的$ PATH和Mac的$ PATH之間巨大的差異。一旦我正確設置了PB的路徑變量,它立即運行。我迫不及待地推動這個項目。非常感謝,非常感謝。 – mtrc 2012-03-28 23:07:22

相關問題