计划说明:
我正在编写一个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();
}
}
}
所以如果我执行该程序,输出是
Cannot run program "cd": error=2.
但它可以像
这样的所有其他命令一起工作ls
df -h
- 等等
我的问题:
从上面的分析我推断出我的java程序无法更改目录。那么如何更改目录路径并执行 bash 命令。
最佳答案
只是为了清楚地说明为什么你不能这样做,cd
命令不是像ar ls
或df这样的程序
。 cd
直接由 shell 解释(并且 shell 更改其自己的工作目录,除了子命令之外将继承其他内容),而对于程序,shell 执行 fork + exec
将程序作为新进程执行。
当您使用runtime.exex()
时,您会启动一个新进程来执行程序(正如已经说过的cd
不是一个程序)。执行脚本(它们也不是程序)的常见解决方法是使用 bash -c 命令。但它对你来说几乎没有用,因为你只会改变子进程的工作目录,而下一个 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");
关于java - 在与 java 程序不同的目录中运行 Bash 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697916/