终端cd命令无法使用Scala脚本

时间:2012-05-15 18:36:48

标签: shell scala io

我需要从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

2 个答案:

答案 0 :(得分:8)

来自Wikipedia on cd command

  Unix系统上的

[...] cd调用chdir() POSIX C函数。这意味着执行命令时,不会创建新进程以迁移到其他目录,就像ls等其他命令一样。相反,shell本身执行此命令。

在那里甚至有关于Java的引用:

  

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

亲自尝试:

$ which ls
/bin/ls
$ which cd
$

简单来说,cd不是您可以运行的程序(进程)(如/bin/ls) - 它更像是命令行指令。

你想要达到什么目的? Changing the current working directory in Java?或更改刚刚创建的流程的工作目录?

答案 1 :(得分: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 实例作为工作目录参数。

(要调用的方法:/scala/src/library/scala/sys/process/Process.scala