Scala 工具包

如何运行进程?

语言

你可以在一行中要求整个工具包

//> using toolkit latest

或者,你只需要求 OS-Lib 的特定版本

//> using dep com.lihaoyi::os-lib:0.9.1

在你的 build.sbt 中,你可以添加对工具包的依赖

lazy val example = project.in(file("example"))
  .settings(
    scalaVersion := "3.2.2",
    libraryDependencies += "org.scala-lang" %% "toolkit" % "0.1.7"
  )

或者,你只需要求 OS-Lib 的特定版本

libraryDependencies += "com.lihaoyi" %% "os-lib" % "0.9.1"

在你的 build.sc 文件中,你可以添加对工具包的依赖

object example extends ScalaModule {
  def scalaVersion = "3.2.2"
  def ivyDeps =
    Agg(
      ivy"org.scala-lang::toolkit:0.1.7"
    )
}

或者,你只需要求 OS-Lib 的特定版本

ivy"com.lihaoyi::os-lib:0.9.1"

启动外部进程

要设置进程,请使用 os.proc,然后实际启动它,call()

val path: os.Path = os.pwd / "output.txt"
println(os.exists(path))
// prints: false
val result: os.CommandResult = os.proc("touch", path).call()
println(result.exitCode)
// prints: 0
println(os.exists(path))
// prints: true

请注意,proc 同时接受字符串和 os.Path

读取进程的输出

(以下示例中的特定命令可能并不存在于所有机器上。)

上面我们看到 call() 返回 os.CommandResult。我们可以使用 out.text() 访问结果的整个输出,或使用 out.lines() 作为行访问。

例如,我们可以使用 bc 为我们做一些数学运算

val res: os.CommandResult = os.proc("bc", "-e", "2 + 2").call()
val text: String = res.out.text()
println(text.trim.toInt)
// prints: 4

或者让 cal 向我们展示日历

val res: os.CommandResult = os.proc("cal", "-h", "2", "2023").call()
res.out.lines().foreach(println)
// prints:
//   February 2023
// Su Mo Tu We Th Fr Sa
//          1  2  3  4
// ...

自定义进程

call() 也接受各种可选参数,这里无法一一解释。例如,你可以设置工作目录 (cwd = ...)、设置环境变量 (env = ...) 或重定向输入和输出 (stdin = ...stdout = ...stderr = ...)。在 OS-Lib 的 README 中查找有关 call 方法的更多信息。

此页面的贡献者