6

我需要从 Scala 脚本运行 shell 命令,为此我使用以下代码段:

import scala.sys.process.{Process, ProcessIO}

val command = "ls /tmp"
val process = Process(command)

val processIO = new ProcessIO(_ => (),
    stdout => scala.io.Source.fromInputStream(stdout).getLines.foreach(println),
    _ => ())
process.run(processIO)

代码工作正常。我想知道为什么我得到

java.io.IOException: Cannot run program "cd": error=2, No such file or directory

一旦我将命令更改cd /tmp && ls为 IMO 相当于ls /tmp

4

2 回答 2

9

来自维基百科的cd命令

[...] 在 Unix 系统上cd调用chdir()POSIX C 函数。这意味着在执行命令时,不会像其他命令(例如ls. 相反,shell 本身会执行此命令。

那里甚至有一段关于 Java 的引述:

[...] Java 编程语言和 Java 虚拟机都不chdir()直接支持;十多年来,当负责 Java 的团队考虑替代方案时,一个变更请求一直处于开放状态,尽管到 2008 年,该请求在仅引入有限支持后被拒绝 [...]

自己试试:

$ which ls
/bin/ls
$ which cd
$

简而言之,cd它不是您可以运行的程序(进程)(如/bin/ls)——它更像是一个命令行指令。

你想达到什么目标?更改 Java 中的当前工作目录?或更改您刚刚创建的进程的工作目录?

于 2012-05-15T18:42:08.357 回答
0

工作解决方案:

import java.io.File
import scala.sys.process.{Process, ProcessIO}

object terminal_cd {
  def main(args: Array[String]): Unit = {
    val command = "ls"
    val process = Process(command, new File("/tmp"))

    val processIO = new ProcessIO(_ => (),
      stdout => scala.io.Source.fromInputStream(stdout).getLines.foreach(println),
      _ => ())
    process.run(processIO)
  }
}

您所需要的只是将"cd /tmp"java.io.File 实例替换为工作目录参数。

(The method to be called: /scala/src/library/scala/sys/process/Process.scala )

于 2021-01-20T12:29:13.553 回答