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

nab*_*nab 5 io shell scala

我需要从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)
Run Code Online (Sandbox Code Playgroud)

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

java.io.IOException: Cannot run program "cd": error=2, No such file or directory
Run Code Online (Sandbox Code Playgroud)

一旦我改变了cd /tmp && lsIMO相当于的命令ls /tmp

Tom*_*icz 8

来自维基百科的cd命令:

[...]在Unix系统上cd调用chdir()POSIX C函数.这意味着当执行命令时,不会像其他命令那样创建新进程来迁移到其他目录ls.相反,shell本身执行此命令.

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

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

亲自尝试一下:

$ which ls
/bin/ls
$ which cd
$
Run Code Online (Sandbox Code Playgroud)

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

你想达到什么目的?在Java中更改当前工作目录?或者更改刚刚创建的流程的工作目录?

  • 在shell中使用`type cd`和`type ls`也可以在shell中进行演示.它应该报告cd不是可执行文件,而是内置的shell (3认同)