簡體   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