Runtime.getRuntime().exec() 不执行某些命令
Runtime.getRuntime().exec() doesn't execute some commands
我是 java 的新手,遇到了一些问题。我已经阅读了关于此主题的多个主题,但其中 none 对我有用。这是我的代码:
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)"。我的问题是:
如何让我的程序运行各种终端命令?对不起,如果问题听起来很愚蠢。谢谢。
您实际上已经运行您要使用的控制台(即 sh、csh、bash 等),然后使用进程 OutputStream 提供命令
我认为问题不是你的代码,而是命令的问题...
如果你的命令是cd,你想看什么??
在后台它改变了路径,但你什么也得不到。
更改目录未处理任何输出。
cd
命令是shell内置命令。当您通过 exec(...)
运行 命令时,没有 shell。实际上,如果您尝试在系统的任何 bin
目录中查找 cd
命令,您将找不到...因为它不可能作为常规命令来实现。
如果您尝试使用 cd
来更改 JVM 本身的当前目录,那是行不通的,因为命令只能更改其自身的当前目录和(之后)命令它启动自己。它无法更改其父进程当前目录。
如果您尝试使用 cd
为后续命令更改当前目录,那也不会起作用。当命令完成时,您设置当前目录的上下文结束。
事实上,使用 exec
更改命令 运行 的目录的正确方法是通过 ProcessBuilder
API 本身进行设置。
How to make my program run all kinds of terminal commands?
你不能。某些 "terminal commands" 仅作为 shell 命令才有意义,这意味着您需要一个 shell.
我想,您可以考虑在 Java 代码中模拟所需的行为。这适用于 cd
...但其他命令可能更难处理。
(就其价值而言,可以在 Java 中实现 POSIX 兼容的 shell。这只是很多工作。)
这对我有用:
Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );
我是 java 的新手,遇到了一些问题。我已经阅读了关于此主题的多个主题,但其中 none 对我有用。这是我的代码:
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)"。我的问题是:
如何让我的程序运行各种终端命令?对不起,如果问题听起来很愚蠢。谢谢。
您实际上已经运行您要使用的控制台(即 sh、csh、bash 等),然后使用进程 OutputStream 提供命令
我认为问题不是你的代码,而是命令的问题...
如果你的命令是cd,你想看什么??
在后台它改变了路径,但你什么也得不到。
更改目录未处理任何输出。
cd
命令是shell内置命令。当您通过 exec(...)
运行 命令时,没有 shell。实际上,如果您尝试在系统的任何 bin
目录中查找 cd
命令,您将找不到...因为它不可能作为常规命令来实现。
如果您尝试使用 cd
来更改 JVM 本身的当前目录,那是行不通的,因为命令只能更改其自身的当前目录和(之后)命令它启动自己。它无法更改其父进程当前目录。
如果您尝试使用 cd
为后续命令更改当前目录,那也不会起作用。当命令完成时,您设置当前目录的上下文结束。
事实上,使用 exec
更改命令 运行 的目录的正确方法是通过 ProcessBuilder
API 本身进行设置。
How to make my program run all kinds of terminal commands?
你不能。某些 "terminal commands" 仅作为 shell 命令才有意义,这意味着您需要一个 shell.
我想,您可以考虑在 Java 代码中模拟所需的行为。这适用于 cd
...但其他命令可能更难处理。
(就其价值而言,可以在 Java 中实现 POSIX 兼容的 shell。这只是很多工作。)
这对我有用:
Runtime.getRuntime().exec(new String[]{ "/system/bin/sh", "-c", "ls -l" } );