[英]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 ls
或df
這樣的程序。 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.