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

时间:2013-03-19 08:21:25

标签: scala ubuntu process sbt

我想从Scala生成一个进程(SBT),以及作为参数传递的两个SBT命令。我制作了一个sbt.sh shell脚本(Manual Installation in sbt Documentation的简化版):

java -jar /home/bob/sbt/sbt/bin/sbt-launch.jar "$@"

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

~/sbt.sh "project Foo" "run"

但是,我想在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.!

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

[error] Expected key
[error] "project Foo"
[error] ^

它在Windows 8上运行正常,但在Ubuntu 12.10上失败。我的pseq曾经是一个普通的String,带有完整的bash命令。我变成了Seq,以便将参数拆分为显式(而不是在任何空格,甚至在引号内)。

有人能指出两次调用之间有什么区别,或者我做错了什么?

1 个答案:

答案 0 :(得分:4)

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

// 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.!

干净,适用于Windows和Linux。在Windows上使用/home/bob/sbt.sh "project Foo" "run"作为命令字符串是相当不优雅的,并且在Linux上不起作用。