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