0

我尝试在 java 中运行这个 shell,但它永远不会工作。

Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");

当我将 cmd 更改为“ ls”或“ open foo.java”之类的代码时,代码将起作用。

知道为什么吗?

4

2 回答 2

1

问题是文件通配符模式没有被glob扩展。因此,模式按字面意思处理,找不到文件。你需要一个 shellbash来解释这个:

Process p = Runtime.getRuntime().exec(new String[] { 
                   "bash", "-c", 
                   "cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });

确保检查getErrorStream的内容。

旁白:考虑使用更方便的ProcessBuilder,它使用 varargs 数组来构建 command String

于 2013-04-26T02:05:14.083 回答
0

这里有几个问题。

  1. *.java部分是一个通常由外壳扩展的球体
  2. 从一个进程到另一个进程组装一个管道也是一个 shell 特性
  3. 输出重定向是一个 shell 功能

基本上,您确实需要调用 shell 来运行这种类型的管道。该exec方法运行带有参数的特定程序。您可以通过直接调用 shell 并将命令行作为参数传递来使其工作,但我怀疑这也行得通。

您可能必须cat *.java通过枚举目录内容并分别读取每个文件来实现该部分。Process为每个命令打开单独的实例,sed并使用实例的输入和输出流实现它们之间的管道Process

于 2013-04-26T02:08:38.380 回答