gpt4 book ai didi

Linux 终端中的 Java 字符串执行

转载 作者:行者123 更新时间:2023-12-01 23:59:26 25 4
gpt4 key购买 nike

我正在使用 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:error=2,没有这样的文件或目录

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

谢谢。

最佳答案

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

你应该做的是使用ProcessBuilder

实例化它,操作它的Map,它表示环境选项(即,您在命令名称之前传递的内容,例如cflags,以及您在命令名称之前传递的任何内容)可能需要),设置命令名称,一次给出一个参数(参数不会在空格处分割,因此您可以传递包含空格的路径,例如)等。您可以操作 stdin、stdout 和 stderr以许多不同的方式(例如:使用与 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

关于Linux 终端中的 Java 字符串执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15104240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com