我是java的初学者并且遇到了一些问题。我已经阅读了几个关于这个主题的主题,但没有一个适合我。这是我的代码:
try
{
Console console = System.console();
String command;
while(true)
{
command = console.readLine("Enter input:");
Process proc = Runtime.getRuntime().exec(command);
// Read the output
BufferedReader reader =
new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = "";
while((line = reader.readLine()) != null) {
System.out.print(line + "\n");
}
proc.waitFor();
}
}
catch(Exception e) {}
所以我正在尝试制作一个java程序并在其中运行终端命令(我正在使用linux)。这个程序使用“ls”“ps ef”等命令,但是当我键入“cd”时它不起作用。我知道cd会产生不同的进程,应该这样使用:“Runtime.exec(String command,String [] envp,File dir)”。我的问题是:
如何让我的程序运行各种终端命令?抱歉,如果问题听起来很傻。谢谢。
答案 0 :(得分:0)
你实际上必须运行你想要使用的控制台(即sh,csh,bash等)然后使用进程OutputStream来输入命令
答案 1 :(得分:0)
我认为问题不是你的代码,命令就是问题......
如果你的命令是cd,你想看到什么?
在后台,它改变了路径但你什么都没有回来。
更改目录不处理任何输出。
答案 2 :(得分:0)
cd
命令是shell内置命令。通过exec(...)
运行命令时没有shell。实际上,如果您尝试在系统的任何cd
目录中找到bin
命令,则找不到一个...因为无法将其作为常规命令实现。
如果您尝试使用cd
来更改JVM本身的当前目录,那将无法工作,因为命令只能更改自身的当前目录,并且(之后)命令它自己启动。它无法更改其父进程的当前目录。
如果您尝试使用cd
更改后续命令的当前目录,那么这也无效。当命令完成时,设置当前目录的上下文结束。
事实上,使用exec
更改命令运行目录的正确方法是通过ProcessBuilder
API本身设置它。
如何让我的程序运行各种终端命令?
你做不到。一些“终端命令”只作为shell命令才有意义,这意味着你需要一个shell。
我想,您可以考虑在Java代码中模拟所需的行为。这适用于cd
......但其他命令可能更难以应对。
(对于它的价值,可以在Java中实现POSIX兼容的shell。这只是很多工作。)
答案 3 :(得分:0)
这对我有用:
Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );