Java Runtime.getRuntime().exec()不';我不能执行一些命令

Java Runtime.getRuntime().exec()不';我不能执行一些命令,java,linux,terminal,Java,Linux,Terminal,我是java初学者,有一些问题。我读过几个关于这个主题的话题,但没有一个对我有用。这是我的密码: try { Console console = System.console(); String command; while(true) { command = console.readLine("Enter input:"); Process proc = Runtime.ge

我是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命令,String[]envp,File dir)”。我的问题是:

如何让我的程序运行各种终端命令?对不起,如果这个问题听起来很傻。谢谢。

您实际上需要运行您想要使用的控制台(如sh、csh、bash等),然后使用进程OutputStream输入命令

我认为问题不在于您的代码,而在于命令

如果您的命令是cd,您希望看到什么

在后台,它改变了路径,但你什么也得不到


更改目录不会处理任何输出。

cd命令是shell内置命令。通过
exec(…)
运行命令时没有shell。实际上,如果您试图在系统的任何
bin
目录中查找
cd
命令,您将找不到一个。。。因为它不可能作为常规命令执行

如果您试图使用
cd
来更改JVM本身的当前目录,那么这将不起作用,因为命令只能更改自身的当前目录以及(之后)它自己启动的命令。它无法将其父进程更改为当前目录

如果您试图使用
cd
更改后续命令的当前目录,则该操作也不会起作用。命令完成时,设置当前目录的上下文结束

事实上,使用
exec
更改命令运行目录的正确方法是通过
ProcessBuilder
API本身进行设置


如何让我的程序运行各种终端命令

你不能。有些“终端命令”仅作为shell命令才有意义,这意味着您需要一个shell

我想,您可以考虑在java代码中模拟所需的行为。这将适用于
cd
。。。但其他命令可能更难处理

(无论如何,在Java中实现一个与POSIX兼容的shell是可能的。这只是一个很大的工作。)

这对我来说很有用:

Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );

Isnt Console=System.Console();默认情况下,这个命令生成bash?不,它不是这样做的。所有这些都是对运行Java的控制台(如果有的话)的引用。您需要打开另一个控制台,正如我所建议的,问题是:“cd”不是命令;这是你的外壳的功能!当像您这样从Java运行命令时;没有贝壳!因此它不起作用!还有一件事:也许你的项目只是学习java概念;但一般来说:允许用户提供任何类型的命令,然后执行它们。。。这是一个非常糟糕的主意。您可能还需要检查此线程。实际上,它正在退出这个项目。使用cd命令,它应该打开目录,但不显示任何内容。在try-catch中添加一个系统并查找错误日志,这样就无法在java中创建类似ssh的程序了?哪个执行每个终端命令?您是否尝试使用
ssh
运行
cd
?它有用吗?你试过exec(“sh-c cd”)?它有用吗?正如我在回答中所说的,用Java实现POSIX外壳是可能的。用C编写这种程序会更容易吗?