Groovy使用包含空格的参数执行

33

我该如何在Groovy字符串的execute方法中传递包含空格的参数?只是像在shell中一样添加空格并不能帮助:

println 'ls "/tmp/folder with spaces"'.execute().text

这将给ls调用三个破碎的参数。

5个回答

34
使用列表的诀窍是:
println(['ls', '/tmp/folder with spaces'].execute().text)

1
如果命令是动态生成的或者由用户输入的话,这种解决方案就不适用了。当然,将引号计数考虑在内进行解析也不应该如此困难... - Uberto

1
抱歉,以上的任何技巧都对我无效。这段可怕的代码是唯一能通过的东西。
    def command = 'bash ~my_app/bin/job-runner.sh -n " MyJob today_date=20130202 " ' 
    File file = new File("hello.sh")
    file.delete()       
    file << ("#!/bin/bash\n")
    file << (command)
    def proc = "bash hello.sh".execute()                 // Call *execute* on the file

1

如果需要处理常规引号、管道等内容,可以使用 bash -c 的一个奇怪技巧。

['bash','-c',
'''
docker container ls --format="{{.ID}}" | xargs -n1 docker container inspect --format='{{.ID}} {{.State.StartedAt}}' | sort -k2,1
'''].execute().text

2
简单说:["bash","-c","带有空格和引号的命令"].execute().text - lepe

-2

对我来说,使用列表有点笨重。

这样做就可以了:

def exec(act) { 
 def cmd = []
 act.split('"').each { 
   if (it.trim() != "") { cmd += it.trim(); }
 }
 return cmd.execute().text
}

println exec('ls "/tmp/folder with spaces"')

更复杂的例子:

println runme('mysql "-uroot" "--execute=CREATE DATABASE TESTDB; USE TESTDB; \\. test.sql"');

唯一的缺点是需要在所有参数周围加上引号,但我可以接受这一点!

-4

你尝试过转义空格吗?

println 'ls /tmp/folder\ with\ spaces'.execute().text

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接