2015-12-29 122 views
0

我试图从Groovy脚本运行复合shell命令。这是其中一个命令,您将其与“& &”分开,以便第二个命令在第一个命令失败时不会运行。无论出于何种原因,我都无法使它工作。我用的是:从Java/Groovy运行复合shell命令

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

外壳保持曲解命令抛出类似的错误“定制CMD -f选项无效”这就像有人忽略的“& &”。我也尝试过使用分号,但并不幸运。我尝试使用直接的Java API Runtime.getRuntime()。exec()并将命令分割成数组。我尝试在单引号中包装命令并将其提供给'/ bin/sh -c',但没有任何效果。

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

+0

也许你需要转义&&。 –

+1

[如何正确调用groovy中的shell命令]的可能重复(http://stackoverflow.com/questions/12512919/how-to-call-shell-commands-from-groovy-correctly)。你不能像&& <|那样使用“shellism”作为命令。使用'-c'并将其作为_one_参数传递(最简单的方法是由字符串数组完成,如果引用变得棘手) – cfrick

回答

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

如上所述,我已经尝试过类似的东西。 (我在OSX上)我用/ bin/sh -c'cmd && othercmd' – Cliff

+0

另外,我已经尝试了拆分而不是拆分cmd。通常在白色空间分割效果更好,但在这种情况下效果不佳。 – Cliff

2

使用Groovy,执行的列表形式应该工作:

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

当然,你可能会想使用过程中consumeProcessOutput方法,因为如果输出太大,呼叫文本可能会阻止

+0

这个工程!谢谢!当我通过/ bin/sh作为可执行文件但bash似乎可行时,它不工作。我也不知道List也支持execute方法!太好了! – Cliff