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

时间:2014-11-02 09:36:34

标签: 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();
        }
    }
}

因此,如果我执行程序,则输出为

  

无法运行程序“cd”:error = 2.

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

  • ls
  • df -h

我的问题:

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

2 个答案:

答案 0 :(得分:5)

为了清楚地说明为什么你不能这样做,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");

答案 1 :(得分:0)

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

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();

    }

  }