我尝试使用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
答案 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)
如果您需要使用|。
运行命令,则第一个选项无效