2013-03-19 137 views
2

我想从Scala产生一个进程(SBT),以及两个作为参数传递的SBT命令。我做了sbt.sh shell脚本(的Manual Installation in sbt Documentation简化版本):bash与带命令行参数的scala.sys.process.Process

java -jar /home/bob/sbt/sbt/bin/sbt-launch.jar "[email protected]" 

如果工作正常,当我调用脚本从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为了得到明确的参数拆分(而不是在任何空间,即使在引号内)。

任何人都可以指出两个调用之间有什么区别,或者我做错了什么?

回答

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上不起作用。