0

我试图在 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 文件夹下,但它们都不能正常工作。

文件名:“Foo.java” 文件名短:“Foo”

4

4 回答 4

1

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

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

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

Process pr = Runtime.getRuntime().exec(new String[]{"/bin/bash", "-c", "/path/script.sh"});
于 2013-11-12T10:52:14.893 回答
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"}); 
于 2013-11-12T10:53:42.720 回答
0

您可以像现在一样连续运行 3 个命令,但是您需要将它们传递给 bash(或另一个 shell)才能运行。正如其他人指出的那样,每次 exec() 调用只能启动一个操作系统进程。所以让这个过程成为一个 bash 并给它运行你需要的过程的方法。或者像另一位用户指出的那样简单地启动 3 个进程。

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

例如,以下内容:

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/

于 2013-11-12T11:01:40.187 回答
0
Runtime.getRuntime().exec

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

于 2013-11-12T10:50:17.903 回答