gpt4 book ai didi

java - 在与 java 程序不同的目录中运行 Bash 命令

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:28:24 24 4
gpt4 key购买 nike

程序说明:

我正在编写一个初始当前目录为/home/user/Desktop 的 Java 程序。我想在“location/home/user/project/”中运行 bash 命令“du -s”来查找该文件夹的大小,以便我可以在我的项目中使用该文件夹的大小。我无法发布整个代码,因为它包含一些敏感数据。我只是发布所需的代码。

这是我所做的:-

import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.File;

public class Exec_in_cur_dir {
public static void main(String[] args) {
try {
StringBuffer output = new StringBuffer();
String Command ="cd /home/user/project"; //Bash Command

// create a process and execute
Process p = Runtime.getRuntime().exec(Command);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));

String line = "";

while ((line = reader.readLine())!= null) {
output.append(line + "\n");
}

System.out.println(output.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}

所以如果我执行程序,输出是

Cannot run program "cd": error=2.

但它正在处理所有其他命令,例如

  • ls
  • df -h
  • 等等

我的问题:

从上面的分析我推断是我的java程序不能改变目录。那么如何更改目录路径并执行 bash 命令。

最佳答案

为了清楚地说明为什么您不能这样做,cd 命令不是像 ar lsdf 这样的程序cd 直接由 shell 解释(并且 shell 会更改其自己的工作目录,除了子命令之外将继承的内容),而对于 programs,shell 执行 fork + exec 将程序作为新进程执行。

当您使用runtime.exex() 时,您启动了一个新进程来执行一个程序(并且如前所述,cd 不是一个程序)。执行脚本(它们也不是程序)的常见解决方法是使用 bash -c 命令。但它对你几乎没有用,因为你只会更改子进程的工作目录,而下一个 exec 仍然有 java 程序的工作目录。

使用 cd 命令实现该目的的唯一方法是在 shell 中更改工作目录,并让该 shell 执行该命令。像这样的东西:

    String Command ="bash -c (cd /home/user/project; du -s )";   //Bash Command
// create a process and execute
Process p = Runtime.getRuntime().exec(Command);

当然,它在 exec 命令本身中更改工作目录的正确方法是避免启动中间 shell:

    String Command ="du -s";   //Bash Command
// create a process and execute
Process p = Runtime.getRuntime().exec(Command, null, new File("/home/user/project");

关于java - 在与 java 程序不同的目录中运行 Bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com