2013-07-02 19 views
1

我試圖運行一組使用Scala進程生成器的shell命令。在Scala中,我運行的進程生成這樣的:使用shell運算符與Scala進程生成器?

val command : String = ... // loaded from file somewhere 
val processBuilder = Process(command) 
val exitCode : Integer = processBuilder.! 

的命令(RAN逐個):

/usr/bin/R --slave --silent --file=test.R argval1 >> out  
/usr/bin/R --slave --silent --file=test.R argval2 >> out  
/usr/bin/R --slave --silent --file=test.R argval3 >> out  

以上這三個shell命令毫無例外會工作,但out文件是永遠創建。那麼下面的最後命令失敗:

awk 'n < $0 {n=$0}END{print n}' out > final 

基本上就拿起文件out的最小元素,並把它放在文件final

awk: syntax error at source line 1 
context is 
>>> ' <<< 
awk: bailing out at source line 1 

回答

1

那些重定向被殼做的,你是不是正在運行的Shell:而在命令行中運行正常工作的awk命令將失敗,並出現以下錯誤。也許這將更好地爲您:

val processBuilder = Process("sh" :: "-c" :: command :: Nil) 

提醒你,該工藝包讓你重定向輸入和輸出直接,就像這樣:

val processBuilder = Process(Seq("/usr/bin/R", "--slave", "--silent", "--file=test.R", "argval1")) #> new java.io.File("out") 

在這裏我有一個Seq因爲替換字符串這通常比讓Scala只用空格分隔命令和參數更安全,因爲它不識別引號。

+0

答案的第一部分解決了大部分問題。剩下的唯一缺點是追加「>>」被解釋爲「>」重定向,因此三個第一個命令覆蓋前一個而不是追加。有任何想法嗎?那麼我會接受。 :) –

+1

@GiovanniAzua這不是一個Scala問題。整個事情正在傳遞給shell,我想不出有什麼理由讓shell做到這一點。我懷疑你沒有執行你認爲正在執行的命令行。 –

0

如果您需要使用|運行命令,第一個選項將無濟於事。