Bash 在Scala process builder中使用shell操作符?

Bash 在Scala process builder中使用shell操作符?,bash,scala,awk,Bash,Scala,Awk,我正在尝试使用Scala process builder运行一组shell命令。在Scala中,我像这样运行process builder: val command : String = ... // loaded from file somewhere val processBuilder = Process(command) val exitCode : Integer = processBuilder.! val processBuilder = Process(Seq("/usr/bi

我正在尝试使用Scala process builder运行一组shell命令。在Scala中,我像这样运行process builder:

val command : String = ... // loaded from file somewhere
val processBuilder = Process(command)
val exitCode : Integer = processBuilder.!
val processBuilder = Process(Seq("/usr/bin/R", "--slave", "--silent", "--file=test.R", "argval1")) #> new java.io.File("out")
命令是(逐个运行):

上面这三个shell命令可以正常工作,但是永远不会创建
out
文件。然后,以下最终命令失败:

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

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

val processBuilder = Process("sh" :: "-c" :: command :: Nil)
请注意,流程包允许您直接重定向输入和输出,如下所示:

val command : String = ... // loaded from file somewhere
val processBuilder = Process(command)
val exitCode : Integer = processBuilder.!
val processBuilder = Process(Seq("/usr/bin/R", "--slave", "--silent", "--file=test.R", "argval1")) #> new java.io.File("out")

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

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

val processBuilder = Process("sh" :: "-c" :: command :: Nil)
请注意,流程包允许您直接重定向输入和输出,如下所示:

val command : String = ... // loaded from file somewhere
val processBuilder = Process(command)
val exitCode : Integer = processBuilder.!
val processBuilder = Process(Seq("/usr/bin/R", "--slave", "--silent", "--file=test.R", "argval1")) #> new java.io.File("out")

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

如果您需要使用|运行命令,第一个选项将不起作用。

如果您需要使用|运行命令,第一个选项将不起作用。

答案的第一部分解决了大部分问题。剩下的唯一一个开放点是append“>>”被解释为“>”重定向,因此前三个命令覆盖了前一个命令,而不是append。有什么想法吗?那我就接受。:)@GiovanniAzua这不是Scala的问题。整个事情都交给了shell,我想不出shell有什么理由这么做。我怀疑您没有执行您认为正在执行的命令行。答案的第一部分解决了大部分问题。剩下的唯一一个开放点是append“>>”被解释为“>”重定向,因此前三个命令覆盖了前一个命令,而不是append。有什么想法吗?那我就接受。:)@GiovanniAzua这不是Scala的问题。整个事情都交给了shell,我想不出shell有什么理由这么做。我怀疑您没有执行您认为正在执行的命令行。