Groovy字符串执行与列表执行

Groovy字符串执行与列表执行,groovy,Groovy,我希望这两个函数的行为相同,其中stdout不是空的: assert !"bash -c \"ls *.txt\"".execute().text.empty // assertion failure here assert !['bash', '-c', 'ls *.txt'].execute().text.empty 但事实并非如此。语义上的区别是什么?对于第一行,我怀疑Groovy将[“-c”,“ls”,“*.txt\”]作为参数发送给bash,但我不确定。有人能证实吗?你的假设是正确的

我希望这两个函数的行为相同,其中stdout不是空的:

assert !"bash -c \"ls *.txt\"".execute().text.empty // assertion failure here
assert !['bash', '-c', 'ls *.txt'].execute().text.empty

但事实并非如此。语义上的区别是什么?对于第一行,我怀疑Groovy将
[“-c”,“ls”,“*.txt\”]
作为参数发送给bash,但我不确定。有人能证实吗?

你的假设是正确的。请参阅thatt命令中的返回代码/stderr:

groovy:000> p = "bash -c \"ls *.txt\"".execute()
===> java.lang.UNIXProcess@54eb2b70
groovy:000> p.waitFor() // exitValue()
===> 1
groovy:000> p.errorStream.readLines()
===> [*.txt": -c: line 0: unexpected EOF while looking for matching `"', *.txt": -c: line 1: syntax error: unexpected end of file]
如果你通过 进入JDK的

java.lang.Runtime:exec(String命令,String[]envp,File dir)

您会发现,
StringTokenizer
用于拆分该字符串/命令,从而使您对shell的
引用变得无用。毕竟,引用仅用于shell本身,而不是
ProcessBuilder