Runtime.getRuntime()。exec()不执行某些命令

时间:2015-05-18 13:55:16

标签: java linux terminal

我是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)”。我的问题是:
如何让我的程序运行各种终端命令?抱歉,如果问题听起来很傻。谢谢。

4 个答案:

答案 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" } );