从Java / Groovy运行复合shell命令

时间:2015-12-29 01:45:59

标签: java bash shell groovy

我试图从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命令?我知道我过去做过这个,但我今天无法理解。

2 个答案:

答案 0 :(得分:2)

使用groovy,执行的列表形式应该有效:

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

当然你可能想在进程上使用consumeProcessOutput方法,就好像输出太大,调用text可能会阻塞

答案 1 :(得分:0)

尝试类似:

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();
}