如何在Groovy中执行带参数的Shell命令?

4
我正在尝试在groovy中使用shell命令notify-send -t 2000 "Title" "Message",并通过下面的方式执行"notify-send -t 2000 \"Title\" \"Message\"".execute(),它可以完美地工作。 但是,当我试图在消息的位置放置表达式时,似乎什么也没发生。 以下是错误的代码:
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' 标题Fri May 06 13:41:43 CEST 2016 groovy.lang.MissingPropertyException:类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) 在sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在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) 在groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:324) 在groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1208) 在groovy.lang.ExpandoMetaClass.invokeMethod(ExpandoMetaClass.java:1111) 在groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1017) 在test.notification.run(notification.groovy:28)'


1
有错误信息吗? - tim_yates
1
你可以使用斜杠字符串使其更整洁:/notify-send -t 2000 "${title}" "${message}"/.execute()。此外,你不需要在消息上调用 toString()。但这些只是装饰,你所说的应该可以工作...捕获输出并显示其内容。 - tim_yates
抱歉,但没有输出。它看起来还不错,但是缺少应该包含文本的通知窗口。您可以在这里查看预期结果[picture] (https://drive.google.com/file/d/0B3xY1NHSe3DoazVTUDRaQmlYbVU/view?usp=sharing)。 - delovepr
@tim_yates 看起来Groovy只期望一个值,因为如果我打印只包含一个单词的消息(例如6May2016),它可以正常工作并显示通知,否则(用'或"包装的两个或三个单词)什么都不做。 :-( - delovepr
3个回答

3

如果你的参数中有空格,就会出现问题。

例如,以下内容将无法正常工作:

Original Answer 翻译成“最初的回答”

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

send_mail.sh将接收两个参数而不是一个。

为了避免问题,请按参数拆分您的字符串。所以可以像这样:

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

第一个项目(0索引)是一个命令,然后跟随参数。

Original Answer翻译成"最初的回答"


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

看起来这个问题主要与字符串格式化有关,并将“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()

无论如何,感谢大家。

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