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

标签 java linux bash shell

计划说明:

我正在编写一个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();
        }
    }
}

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

Cannot run program "cd": error=2.

但它可以像

这样的所有其他命令一起工作
  • ls
  • df -h
  • 等等

我的问题:

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

最佳答案

只是为了清楚地说明为什么你不能这样做,cd命令不是像ar lsdf这样的程序cd 直接由 shell 解释(并且 shell 更改其自己的工作目录,除了子命令之外将继承其他内容),而对于程序,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/

相关文章:

java - 将特定行从一个二维数组复制到另一个二维数组,无需 system.arraycopy

java - 如何在 JPA 中使用 TypedQuery 更改顺序

linux - 通过 bash 自动将 iptables 中的 IP 地址列入白名单

linux - 是否使用 Xvfb 运行 OpenGL 效果版本?

bash - 试图将一个字符串拆分为两个变量

bash - 无法从 shell 脚本调用 openscad -D 命令行

java - java字节码是独立于CPU还是独立于OS?

java - 从外部网站执行java GUI程序

linux - pg_restore 分隔符

linux - 按书名/作者搜索书籍