计划说明:
我正在编写一个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”:error = 2.
但它正在处理所有其他命令,如
ls
df -h
我的问题:
从上面的分析我推断的是我的java程序无法改变目录。那么如何更改目录路径并执行bash命令。答案 0 :(得分:5)
为了清楚地说明为什么你不能这样做,cd
命令不是像ar ls
或df
这样的程序。 cd
由shell直接解释(并且shell会更改自己的工作目录,但将继承子命令),而对于程序,shell执行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");
答案 1 :(得分:0)
我认为上面代码的正确写法形式是: -
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();
}
}