bash与带命令行参数的scala.sys.process.Process
问题描述:
我想从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
为了得到明确的参数拆分(而不是在任何空间,即使在引号内)。
任何人都可以指出两个调用之间有什么区别,或者我做错了什么?
答
我遇到了解决方案。原来是微不足道的,但值得分享:
// 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上不起作用。