1

我正在尝试使用 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并将其放入 file finalawk在命令行中运行该命令时,该命令将失败并出现以下错误:

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

2 回答 2

1

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

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

请注意,process 包允许您直接重定向输入和输出,如下所示:

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

在这里,我用 a 替换字符串,Seq因为这通常比让 Scala 简单地用空格分隔命令和参数更安全,因为它不识别引号。

于 2013-07-02T15:40:04.803 回答
0

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

于 2014-02-01T20:02:57.983 回答