【问题标题】:Run a compound shell command from Java/Groovy从 Java/Groovy 运行复合 shell 命令
【发布时间】:2016-04-02 21:07:54
【问题描述】:

我在尝试从 Groovy 脚本运行复合 shell 命令时遇到了困难。这是您用“&&”分隔的命令之一,因此如果第一个命令失败,第二个命令将永远不会运行。无论出于何种原因,我都无法让它工作。我正在使用:

println "custom-cmd -a https://someurl/path && other-cmd -f parameter".execute([], new File('/some/dir')).text

shell 一直误解命令抛出错误,例如“custom-cmd -f invalid option”,就像它忽略了中间的“&&”。我也尝试使用分号,但并不幸运。我尝试使用直接的 Java API Runtime.getRuntime().exec() 并将命令拆分为一个数组。我尝试将命令用单引号括起来并将其提供给 '/bin/sh -c' 但没有任何效果。

如何从 Java 运行复合 shell 命令?我知道我过去曾这样做过,但我今天无法弄清楚。

【问题讨论】:

标签: java bash shell groovy


【解决方案1】:

使用 groovy,执行的列表形式应该可以工作:

def out = ['bash', '-c', "custom-cmd -a https://someurl/path && other-cmd -f parameter"].execute([], new File('/some/dir')).text

当然你可能想在进程上使用consumeProcessOutput方法,如果输出太大,调用文本可能会阻塞

【讨论】:

  • 这行得通!谢谢!当我将 /bin/sh 作为可执行文件传递时它不起作用,但 bash 似乎可以工作。另外我不知道List也支持execute方法!不错!
【解决方案2】:

尝试类似:

Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");

Runtime.getRuntime().exec() 可以在不将命令拆分为数组的情况下使用。

https://stackoverflow.com/a/18867097/1410671

编辑:

您是否尝试过使用ProcessBuilder?这似乎适用于我的 OSX 机器:

public static void main(String[] args) throws IOException {
    ProcessBuilder builder = new ProcessBuilder( "/bin/sh", "-c", "echo '123' && ls" );

    Process p=null;
    try {
        p = builder.start();
    }
    catch (IOException e) {
        System.out.println(e);
    }


    Scanner s = new Scanner( p.getInputStream() );
    while (s.hasNext())
    {
        System.out.println( s.next() );
    }
    s.close();
}

【讨论】:

  • 如上所述,我已经尝试过这样的事情。 (我在 OSX 上)我使用 /bin/sh -c 'cmd && othercmd'
  • 另外,我尝试过拆分和不拆分 cmd。通常在空白处分割效果更好,但在这种情况下则不然。
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多