我试图在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”
答案 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/