程序说明:
我正在编写一个java程序,它的初始当前目录是/home/user/desktop。我想在“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();
        }
    }
}

所以如果我执行程序,输出是
无法运行程序“cd”:错误=2。
但其他命令都在起作用
ls
df -h
等。
我的问题是:
从上面的分析中我推断出我的java程序不能改变目录。因此,我如何更改目录路径并执行bash命令。

最佳答案

为了清楚地说明为什么不能这样做,cd命令不是arlsdf这样的程序。cd由shell直接解释(shell更改自己的工作目录,除了子命令之外,其他工作目录将被继承),而对于程序,shell执行fork + exec以将程序作为新进程执行。
当您使用runtime.exex()时,您将启动一个新进程来执行程序(正如前面所说的cd不是程序)。执行脚本(它们也不是程序)的常见解决方法是使用bash -c command。但它几乎不适合您,因为您只需要更改子进程的工作目录,而nextexec仍然拥有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");

09-05 06:55
查看更多