ProcessBuilder从String列表中执行一个命令,但不执行下一个命令。

时间:2013-12-05 17:46:59

标签: java bash processbuilder

我是编程新手。我为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创建单独的文件。你能否回答为什么下一个命令(来自字符串列表)没有被执行?谢谢!

2 个答案:

答案 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();
}
相关问题