0

我正在使用 StringBuilder 创建一个字符串,然后尝试在 Linux 终端上执行该字符串。但不是执行整个命令,而是执行一半命令然后终止它。这是我的java代码片段:

moteCommand.append("CFLAGS+=-DCC2420_DEF_CHANNEL=1");
moteCommand.append(" ");
moteCommand.append("make telosb install.");
moteCommand.append(moteIdList.get(i).toString());
moteCommand.append(" bsl,");
moteCommand.append(moteAddrList.get(i).toString());
String moteCommand2 = moteCommand.toString();
Process moteProgProcess = Runtime.getRuntime().exec(moteCommand2, null,"/opt/tinyos-2.x/apps/XXX/);

它给了我这个错误:无法运行程序“CFLAGS+=-DCC2420_DEF_CHANNEL=1”(在目录“/opt/tinyos-2.x/apps/xxx”中):java.io.IOException:错误=2,没有这样的文件或目录

我不明白为什么系统进程试图只执行一半的字符串。如果有人知道原因,请告诉我。

谢谢。

4

1 回答 1

3

当您调用Runtime.exec()时,第一个空格之前的字符必须是您要启动的程序的名称。之后,空格之间的每个“部分”都是一个单独的参数。请注意,调用Runtime.exec()与在 bash(或任何其他 shell ...)中键入命令并按 enter 完全不同!如果您键入一个在 bash 中可以正常工作的命令,这并不意味着它可以在Runtime.exec(). 例如,shell 命令(不是外部程序)在Runtime.exec().

你应该做的是使用ProcessBuilder.

实例化它,操作它Map表示环境选项(即,您在命令名称之前传递的东西,例如 cflags,以及您可能想要的任何其他内容),设置命令名称,一次给一个参数(参数不会在空格处拆分,因此您可以传递包含空格的路径,例如)等。您可以通过多种不同方式操作标准输入、标准输出和标准错误(例如:使用与 Java 进程使用的相同) ; 或获取 InputStream 和 OutputStream 的实例以向进程写入和读取;或通过管道传输它们),然后运行进程。

类似的东西:

final ProcessBuilder pb = new ProcessBuilder("make", "telosb", "install" blablablabla);
final Map<String, String> env = pb.environment();
env.put("CFLAGS", "....your options....");
pb.start(); // take the Process instance, and you will be able to read the output, wait for it to finish, get the exit code, etc 
于 2013-02-27T04:48:47.337 回答