繁体   English   中英

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

[英]Running a Bash Command in different directory from a java program

程序说明:

我正在编写一个Java程序,其初始当前目录为/ home / user / Desktop。 我想在“位置/ 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命令。

只是为了清楚说明为什么不能这样做, cd命令不是像ar lsdf这样的程序。 cd由外壳程序直接解释(外壳程序将更改其自己的工作目录,但要继承的是子命令),而对于程序 ,外壳程序执行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();

    }

  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM