我需要从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
?
答案 0 :(得分:8)
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 实例作为工作目录参数。