2013-07-02 17 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

如果您需要使用|运行命令,第一个选项将无济于事。