我尝试在java中运行此shell但它永远不会工作。
Process p = Runtime.getRuntime().exec(" cat *.java|sed '/import/d'|sed'/package/d'>>b.java ");
当我将cmd更改为“ls
”或“open foo.java
”时,代码将有效。
知道为什么吗?
答案 0 :(得分:1)
问题是文件通配符模式没有被glob扩展。因此,字面上处理模式并且找不到文件。你需要一个像bash
这样的shell来解释这个:
Process p = Runtime.getRuntime().exec(new String[] {
"bash", "-c",
"cat *.java|sed '/import/d'|sed'/package/d'>>b.java" });
请务必查看getErrorStream。
的内容除此之外:考虑使用更方便的ProcessBuilder,它使用varargs数组来构建命令String
。
答案 1 :(得分:0)
这里有一些问题。
*.java
部分是一个通常由shell扩展的glob 基本上,您确实需要调用shell来运行此类型的管道。 exec
方法使用参数运行特定程序。您可以通过直接调用shell并将命令行作为参数传递来使其工作,但我怀疑它是否也可以。
您可能必须通过枚举目录内容并分别读取每个文件来实现cat *.java
部分。为每个Process
命令打开单独的sed
实例,并使用Process
实例的输入和输出流实现它们之间的管道。