Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux终端中Java字符串的执行_Java_System_Exec_Processbuilder - Fatal编程技术网

Linux终端中Java字符串的执行

Linux终端中Java字符串的执行,java,system,exec,processbuilder,Java,System,Exec,Processbuilder,我正在使用StringBuilder创建一个字符串,然后尝试在Linux终端上执行该字符串。但它并没有执行整个命令,而是执行了半个命令,然后终止它。这是我的java代码片段: moteCommand.append("CFLAGS+=-DCC2420_DEF_CHANNEL=1"); moteCommand.append(" "); moteCommand.append("make telosb install."); moteCommand.append(moteIdList.get(i).to

我正在使用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

实例化它,操作它的
映射
,该映射表示环境选项(即,在命令名之前传递的内容,例如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 
final ProcessBuilder pb=新的ProcessBuilder(“make”、“telosb”、“install”bla);
最终映射环境=pb.environment();
环境看跌期权(“CFLAGS”,“您的期权…”);
pb.start();//以流程实例为例,您将能够读取输出,等待它完成,获取退出代码,等等

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

您应该使用
ProcessBuilder

实例化它,操作它的
映射
,该映射表示环境选项(即,在命令名之前传递的内容,例如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 
final ProcessBuilder pb=新的ProcessBuilder(“make”、“telosb”、“install”bla);
最终映射环境=pb.environment();
环境看跌期权(“CFLAGS”,“您的期权…”);
pb.start();//以流程实例为例,您将能够读取输出,等待它完成,获取退出代码,等等

你能给我举一个关于我的代码的例子吗?因为我已经尝试过像这样使用ProcessBuilder,但它不起作用。ProcessBuilder pb=new ProcessBuilder(“CFLAGS+=-DCC2420_DEF_CHANNEL=1”,“make”,“telosb”,“install.0”,“bsl,/dev/ttyUSB0”);moteProgProcess=pb.start();您没有执行我上面描述的操作,这就是它不起作用的原因。实际上,您使用它的方式与使用
Runtime.exec()
的方式完全相同。打开ProcessBuilder的JavaDocs,您会得到一个很好的示例,包括环境选项和所有选项:请注意您的“myCommand”不是
CFLAGS…
,而是
make
,即您要启动的进程的名称。您
CFLAGS…
事情是环境的一部分。这就是您要我做的吗?ProcessBuilder pb=new ProcessBuilder(“make”,“telosb”,“install.0”,“bsl,/dev/ttyUSB0”);Map env=pb.environment();env.put(“var1”,“CFLAGS+=-DCC2420_DEF_CHANNEL=1”);pb.目录(新文件(“/opt/tinyos-2.x/apps/XXX”);进程p1=pb.start();?否。您正在将值“CFLAGS+=-…”放在名为“var1”的变量上“。您需要的是一个名为CFLAGS的变量。您能给我一个关于我的代码的示例吗?因为我已经尝试过这样使用ProcessBuilder,但它不起作用。ProcessBuilder pb=new ProcessBuilder(“CFLAGS+=-DCC2420_DEF_CHANNEL=1”,“make”,“telosb”,“install.0”,“bsl,/dev/ttyUSB0”);moteProgProcess=pb.start();您没有执行我上面描述的操作,这就是它不起作用的原因。实际上,您使用它的方式与使用
Runtime.exec()
的方式完全相同。打开ProcessBuilder的JavaDocs,您会得到一个很好的示例,包括环境选项和所有选项:请注意您的“myCommand”不是
CFLAGS…
,而是
make
,即您要启动的进程的名称。您
CFLAGS…
事情是环境的一部分。这就是您要我做的吗?ProcessBuilder pb=new ProcessBuilder(“make”,“telosb”,“install.0”,“bsl,/dev/ttyUSB0”);Map env=pb.environment();env.put(“var1”,“CFLAGS+=-DCC2420_DEF_CHANNEL=1”);pb.目录(新文件(“/opt/tinyos-2.x/apps/XXX”);进程p1=pb.start();?否。您正在输入值