【发布时间】:2017-11-14 00:23:13
【问题描述】:
我在执行下面的命令时遇到了类似java.io.IOException: Cannot run program cat /home/talha/* | grep -c TEXT_TO_SEARCH": error=2, No such file or directory 的异常,尽管当我通过终端执行相同的命令时没有问题。我需要执行并返回下面的命令:
cat /home/talha/* | grep -c TEXT_TO_SEARCH
下面是使用Runtime类执行命令的方法:
public static String executeCommand(String command) {
StringBuffer output = new StringBuffer();
Process p;
try {
p = Runtime.getRuntime().exec(command);
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();
}
【问题讨论】:
-
指定
cat&grep命令的完整路径。 -
但是该命令可以通过终端 (bash) 正常工作
-
好吧,那是因为
$PATH已定义,所以它知道要沿着/usr/bin:/sbin:/usr/sbin:/usr/local/bin寻找cat。在 Java 运行时的上下文中,它没有那个环境。 -
Runtime.exec 不使用 shell(例如,
/bin/bash);它将命令直接传递给操作系统。这意味着像*和管道 (|) 这样的通配符将不会被理解,因为cat(像所有 Unix 命令一样)不会对这些字符进行任何解析。你需要使用p = new ProcessBuilder("bash", "-c", command).start();之类的东西,或者,如果出于某种奇怪的原因你需要坚持使用过时的 Runtime.exec 方法,p = Runtime.getRuntime().exec(new String[] { "bash", "-c", command });。 -
您能发表您的评论作为答案吗?然后,我将能够接受您的回答作为问题的解决方案。 @VGR
标签: java linux unix cat runtime.exec