如何在groovy中使用参数执行shell命令?

时间:2016-05-06 09:34:18

标签: shell groovy

我试图以下一种方式notify-send -t 2000 "Title" "Message"使用来自groovy的shell命令"notify-send -t 2000 \"Title\" \"Message\"".execute(),它完美无缺。 但是,当我试图用exprsession代替消息时,它似乎没有用。 这是以下破解的代码:

def todayDate = new Date()

def title = 'Title'
def message = " Message ${todayDate}"
println(title + message)
"notify-send -t 2000 \"${title}\" \"${message}\"".execute()
你可以帮助我理解吗?

  

连接到目标VM,地址:'127.0.0.1:40305',传输:'socket'   TitleFri May 06 13:41:43 CEST 2016   groovy.lang.MissingPropertyException:没有这样的属性:execute for class:DUMMY       在org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:51)       在org.codehaus.groovy.runtime.callsite.PogoGetPropertySite.getProperty(PogoGetPropertySite.java:49)       在org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGroovyObjectGetProperty(AbstractCallSite.java:295)       在DUMMY $ _closure1.doCall(DUMMY.groovy:1)       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)       在java.lang.reflect.Method.invoke(Method.java:497)       在org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:90)       在org.codehaus.groovy.runtime.metaclass.ClosureMetaMethod.invoke(ClosureMetaMethod.java:81)       at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324)       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1208)       at groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1111)       at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1017)       在test.notification.run(notification.groovy:28)'

3 个答案:

答案 0 :(得分:1)

您需要事先将命令声明为变量,然后执行命令。

你可以这样做:

def todayDate = new Date().toString()
def title = 'Title'
def message = " Message ${todayDate.toString()}".toString()
println(title + message)
def command = "notify-send -t 2000 \"${title}\" \"${message}\""
command.execute()

答案 1 :(得分:1)

似乎这个问题主要与字符串格式化和误解“Message 9 May 2016”作为一个字符串(参数)有关。 对我而言,它的工作方式如下:

def command = new String[3]
command[0] = "notify-send"
command[1] = "Title"
command[2] = "\"Message ${todayDate}.toString()\"".toString()
def process = new ProcessBuilder(command).start()

无论如何,感谢所有人。

答案 2 :(得分:0)

因此,如果参数中有空格,则会出现问题。

例如,这将起作用:

def command = "send_mail.sh \"Some text\""
command.execute();

send_mail.sh将接收2个参数,而不是1个。

因此,为避免出现问题,请按参数将字符串分开。像这样:

def command = ["send_mail.sh", "Some text"];
command.execute();

第一项(索引为0)是命令,然后是参数。