我是编程新手。我为ProcessBuilder创建了一个String列表。 ProcessBuilder正在从String列表中执行一个命令(并成功写入我要写的文件)但不执行下一个String命令。这是代码:
List<String> vsArrays = new ArrayList<String>();
vsArrays.add("/bin/sh");
vsArrays.add("-c");
vsArrays.add("echo '123' > ~/1.rad");
vsArrays.add("echo '123' > ~/2.rad");
vsArrays.add("echo '123' > ~/3.rad");
for (String s : vsArrays){
system.out.println(s);
}
ProcessBuilder proc = new ProcessBuilder(vsArrays);
Process start = proc.start();
start.waitFor();
第一个文件(名为1.rad)在home(〜)目录中创建,但以下文件不是。虽然我设法通过使用文件中的redirectInput来执行下一个命令(并编写其他文件),但我不想为redirectInput创建单独的文件。你能否回答为什么下一个命令(来自字符串列表)没有被执行?谢谢!
答案 0 :(得分:2)
ProcessBuilder
从未打算执行多个命令。 List
的条目被视为参数,它是被调用的程序sh
,由于-c
选项而执行一个参数。所以它是sh
命令和它的-c
选项,它“决定”解释一个参数,并且只有一个,作为开始的命令。但是bash将运行多个命令,作为由;
分隔的单个参数提供。
List<String> vsArrays = new ArrayList<String>();
vsArrays.add("/bin/sh");
vsArrays.add("-c");
vsArrays.add("echo '123' > ~/1.rad; echo '123' > ~/2.rad; echo '123' > ~/3.rad");
ProcessBuilder proc = new ProcessBuilder(vsArrays);
Process start = proc.start();
start.waitFor();
答案 1 :(得分:0)
我暂时没有使用进程构建器,但我相信你将最后4个字符串作为参数传递给第一个字符串(可执行文件)。在这种情况下,我不确定你构造的命令是否有效。尝试类似的事情(我自己没有测试过代码,但应该给你一些想法):
private void myMainFunction() {
doWrite("1.rad");
doWrite("2.rad");
doWrite("3.rad");
}
private void doWrite(String filename) {
List<String> vsArrays = new ArrayList<String>();
vsArrays.add("/bin/sh");
vsArrays.add("-c");
vsArrays.add("echo '123' > ~/" + filename);
for (String s : vsArrays){
system.out.println(s);
}
ProcessBuilder proc = new ProcessBuilder(vsArrays);
Process start = proc.start();
start.waitFor();
}