程序说明:
我正在编写一个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”:错误=2。
但其他命令都在起作用
ls
df -h
等。
我的问题是:
从上面的分析中我推断出我的java程序不能改变目录。因此,我如何更改目录路径并执行bash命令。
最佳答案
为了清楚地说明为什么不能这样做,cd
命令不是arls
或df
这样的程序。cd
由shell直接解释(shell更改自己的工作目录,除了子命令之外,其他工作目录将被继承),而对于程序,shell执行fork + exec
以将程序作为新进程执行。
当您使用runtime.exex()
时,您将启动一个新进程来执行程序(正如前面所说的cd
不是程序)。执行脚本(它们也不是程序)的常见解决方法是使用bash -c command
。但它几乎不适合您,因为您只需要更改子进程的工作目录,而nextexec
仍然拥有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");