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

程序说明:

我正在编写一个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程序无法更改目录。 那么如何更改目录path并执行bash命令。

Solutions Collecting From Web of "在java程序的不同目录中运行Bash命令"

只是为了清楚说明为什么你不能这样做, cd命令不是像AR lsdf的程序。 cd是由shell直接解释的(shell改变它自己的工作目录什么将被继承,但子命令),而对于程序 ,shell执行fork + exec来执行程序作为一个新的进程。

当你使用runtime.exex() ,你启动一个新的进程来执行一个程序(和前面说的cd不是一个程序)。 执行脚本(它们也不是程序)的常用解决方法是使用bash -c command 。 但是它几乎不适合你,因为你只会改变子进程的工作目录,而下一个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"); 

我认为写上面代码的正确形式是:

 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.File; public class Execute { public static void main (String args[]) { String command="du -s"; String output=executeCommand1(command); System.out.println(output); } public static String executeCommand1(String command) { StringBuffer output = new StringBuffer(); Process p; try { File dir = new File("/home/user/project");//path p = Runtime.getRuntime().exec(command,null,dir); p.waitFor(); BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = ""; while ((line = reader.readLine())!= null) { output.append(line + "\n"); } } catch (Exception e) { e.printStackTrace(); } return output.toString(); } }