bash 与带有命令行参数的 scala.sys.process.Process

Mat*_*eid 3 ubuntu scala process sbt

我想从 Scala 生成一个进程(就此而言,SBT),以及作为参数传递的两个 SBT 命令。我制作了一个sbt.shshell脚本(sbt文档中手动安装的简化版本):

java -jar /home/bob/sbt/sbt/bin/sbt-launch.jar "$@"
Run Code Online (Sandbox Code Playgroud)

当我从 Ubuntu 中的 bash 提示符(/home/bob/workingdir作为工作目录)调用脚本时,如果工作正常:

~/sbt.sh "project Foo" "run"
Run Code Online (Sandbox Code Playgroud)

但是,我想使用以下代码在 Scala 程序中调用它:

val pseq = Seq("/home/bob/sbt.sh", "\"project Foo\"", "\"run\"")
val pb = scala.sys.process.Process(pseq, new java.io.File("/home/bob/workingdir"))
pb.!
Run Code Online (Sandbox Code Playgroud)

SBT 正常启动和加载,然后失败并显示以下错误输出:

[error] Expected key
[error] "project Foo"
[error] ^
Run Code Online (Sandbox Code Playgroud)

它在 Windows 8 上运行良好,但在 Ubuntu 12.10 上失败。我pseq曾经是一个String拥有完整 bash 命令的普通用户。我变成了 aSeq以便使参数明确分割(而不是在任何空格,即使在引号内)。

谁能指出这两个调用之间有什么区别,或者我还做错了什么?

Mat*_*eid 5

我找到了解决方案。结果是微不足道的,但无论如何值得分享:

// no \"-quoting of passed SBT commands here!
val pseq = Seq("/home/bob/sbt.sh", "project Foo", "run")
val pb = scala.sys.process.Process(pseq, new java.io.File("/home/bob/workingdir"))
pb.!
Run Code Online (Sandbox Code Playgroud)

简洁,并且可以在 Windows 和 Linux 上运行。在 Windows 上用作/home/bob/sbt.sh "project Foo" "run"命令字符串相当不雅观,并且在 Linux 上不起作用。