【问题标题】:bash vs. scala.sys.process.Process with Command Line Arguments带有命令行参数的 bash 与 scala.sys.process.Process
【发布时间】:2013-06-11 09:21:03
【问题描述】:

我想从 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,以便明确地拆分参数(而不是在任何空格处,即使在引号内)。

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

【问题讨论】:

    标签: scala ubuntu process sbt


    【解决方案1】:

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

    // 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 上运行。使用/home/bob/sbt.sh "project Foo" "run" 作为命令字符串在 Windows 上相当不雅,在 Linux 上也不起作用。

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2022-07-26
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多