首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Groovy执行复杂的shell命令

问Groovy执行复杂的shell命令
EN

Stack Overflow用户
提问于 2018-05-31 07:05:06
回答 2查看 1.4K关注 0票数 3

我想在Groovy脚本中执行shell命令,其中脚本的一部分是文件名的变量,其中可能包含空格。

根据groovy execute with parameters containing spaces的说法,我可以使用一个数组来实现这一点:

代码语言:javascript
复制
def filename = '/tmp/folder with spaces'

// does not work
'ls "' + filename + '"'.execute()

// works
['ls', filename].execute()

但是我不知道如何使用一个数组来重新格式化下面的命令,其中" filename“是一个groovy变量,包含一个带空格或不带空格的文件名:

代码语言:javascript
复制
mdfind "$(/usr/libexec/PlistBuddy -c 'Print RawQuery' filename)"

这不起作用:

代码语言:javascript
复制
// not working
["mdfind", "\$(/usr/libexec/PlistBuddy -c 'Print RawQuery' " + filename + ")"].execute()
["mdfind", "\$(/usr/libexec/PlistBuddy -c 'Print RawQuery' ", filename, ")"].execute()
EN

回答 2

Stack Overflow用户

发布于 2018-05-31 07:15:09

除非知道/usr/libexec/PlistBuddy的原始输出可能是什么,否则很难判断必须如何放置括号才能提供语法意义。

代码语言:javascript
复制
println([
    "mdfind",
    "/usr/libexec/PlistBuddy",
    "-c 'Print RawQuery'",
    "${filename}"
].execute().text)

请参阅Process Management上的Groovy文档-将语句拆分为两个语句可能会提供一些线索,为什么它不能像预期的那样工作-同时,一旦两个部分都返回了所需的结果,仍然可以将其格式化为单行语句。还可以在输出捕获的文本之前终止进程;|操作符也可以在那里使用,只是不在[]括号中的命令/参数数组中...因为我的印象是,它很可能是这样的:

代码语言:javascript
复制
def p = "mdfind".execute() | [
    "/usr/libexec/PlistBuddy",
    "-c 'Print RawQuery'",
    "${filename}"
].execute()
p.waitFor()
println p.text

我会考虑最简单的公式:["mdfind", "-name ${filename}"].execute()

票数 0
EN

Stack Overflow用户

发布于 2018-05-31 17:52:10

我总是使用split()运行复杂的shell命令。

示例:

代码语言:javascript
复制
def sout = new StringBuilder(), serr = new StringBuilder()
def shellCommand="" //your shell command here
Process proc = shellCommand.split().execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(100000L)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50614463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档