[英]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.