在Scala进程构建器中使用shell运算符?

时间:2013-07-02 15:08:00

标签: bash scala awk

我尝试使用Scala流程构建器运行一组shell命令。在Scala中,我像这样运行流程构建器:

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

命令是(逐个运行):

/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命令将失败,并显示以下错误:

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

2 个答案:

答案 0 :(得分:1)

这些重定向是由shell完成的,而你没有运行shell。也许这对你更有效:

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简单地用空格分区命令和参数更安全,因为它不能识别引号。

答案 1 :(得分:0)

如果您需要使用|。

运行命令,则第一个选项无效