无法在java代码中运行命令

时间:2013-11-12 10:46:49

标签: java bash shell

我试图在java中运行多个shell命令。这是我的代码:

Process send = Runtime.getRuntime().exec(new String[] {"javac /tmp/"+ fileName + ";" + "sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + ";" + "java /tmp/"+ fileNameShort + ".class;"}); 

我知道文件正好在tmp文件夹下,但它们都没有正常工作。

filename:“Foo.java” fileNameShort:“Foo”

4 个答案:

答案 0 :(得分:1)

不,你不能这样做,因为这个方法:

  

在单独的进程中执行指定的字符串命令。

最好创建一个shell脚本并调用该脚本:

Process pr = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "/path/script.sh"});

答案 1 :(得分:1)

您正在连续执行三个命令。每个命令应该是单独的Process。此外,命令和参数应分解为数组的元素:

Process send1 = Runtime.getRuntime().exec(new String[] {"javac", "/tmp/"+ fileName});
send1.waitFor();  // this returns an int with the exit status of the command - you really should check this!
Process send2 = Runtime.getRuntime().exec(new String[] {"sed", "-i", "s/Foo/Foo2/g", "/tmp/"+ fileName});
send2.waitFor();
Process send3 = Runtime.getRuntime().exec(new String[] {"java", "/tmp/"+ fileNameShort+".class"});
send3.waitFor();

或者,将整个内容提供给sh -c(尽管你真的应该使用前面的方法,因为你不必担心转义参数等。)

Process send = Runtime.getRuntime().exec(new String[] {"sh", "-c", "javac /tmp/"+ fileName + "; sed -i 's/Foo/Foo2/g' /tmp/"+ fileName + "; java /tmp/"+ fileNameShort + ".class"}); 

答案 2 :(得分:0)

Runtime.getRuntime().exec

不是你的命令行 - 你不能同时处理几个命令,不能使用重定向等...

答案 3 :(得分:0)

您可以像往常一样连续运行3个命令,但是您需要将它们传递给bash(或其他shell)才能运行。正如其他人所指出的,每个exec()调用只能启动一个OS进程。因此,将此过程变为bash并为其提供运行所需流程的方法。或者像其他用户指出的那样简单地启动3个进程。

然后你的问题就变成了一个障碍。

例如,以下内容:

echo -e "echo 'AAA'; for x in 1 2 3; do echo 'BBB'; done; echo 'CCC'" | bash

将打印

AAA
BBB
BBB
BBB
CCC

这些实际上是3个进程,您可以在单个exec()中运行所有这些进程。

现在,关于您实际尝试解决的问题,看起来您想要更改字节码。我建议使用一个库。看看ASM:http://asm.ow2.org/