【问题标题】:ProcessBuilder executes one command from the String list but doesn't executes the next one.ProcessBuilder 执行字符串列表中的一个命令,但不执行下一个命令。
【发布时间】:2013-12-05 17:46:58
【问题描述】:

我是编程新手。我为 ProcessBuilder 创建了一个字符串列表。 ProcessBuilder 正在执行字符串列表中的一个命令(并成功写入了我要求写入的文件),但不执行下一个字符串命令。代码如下:

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)是在主 (~) 目录中创建的,但以下文件不是。尽管我设法通过使用文件中的redirectInput 来执行下一个命令(并写入其他文件),但我不想为redirectInput 创建一个单独的文件。您能否回答为什么没有执行下一个命令(来自字符串列表)?谢谢!

【问题讨论】:

    标签: java bash processbuilder


    【解决方案1】:

    ProcessBuilder 从来没有打算执行多个命令。 List 的条目被视为参数,由于-c 选项,它是被调用的程序sh 执行一个参数。因此,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();
    

    【讨论】:

    • 谢谢!但是 ProcessBuilder 通过redirectInput 执行多个命令。那么如果我将“sh”程序的“-c”选项更改为其他选项,会有什么解决方案吗?我查看了 sh 手册,但找不到合适的选项。
    • 也许您在我编辑最后一部分时阅读了答案;提到了一个解决方案,将多个;-separated 命令放入一个参数中。
    • 谢谢!这行得通!我没有升级您的解决方案的声誉。谢谢!
    • @Vaib:但你可以“accept”,只需点击复选标记。这也将为您带来一些声誉,因此您将更接近可以投票的地步……
    • 谢谢! Stackoverflow 及其用户都很棒!
    【解决方案2】:

    我已经有一段时间没有使用流程构建器了,但我相信您将最后 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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多