尝试从脚本控制台运行shell命令的奇怪的不匹配报价问题

时间:2018-12-20 22:59:07

标签: jenkins groovy

我正在尝试从脚本控制台运行本地shell命令,但不匹配的引用错误正在踢我的屁股。整个命令用双引号引起来,从“ -c”执行的命令用单引号引起来。我发誓没有错字!有任何想法吗?奇怪的是,似乎只有在单引号中有多个由空格分隔的项目时,才会发生这种情况。如果我执行“ ls”之类的单个可执行文件,则效果很好。

def String target_database = "testdb"
def String version = "7.6.5.4"

def sout = new StringBuffer(), serr = new StringBuffer()
def proc = "sudo su oracle -c '/home/oracle/scripts/datapump/refresh_database.sh ${target_database} ${version}'".execute()

proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println "STDOUT\n $sout"
println "STDERR\n $serr"

STDOUT

STDERR  testdb:-c:第0行:寻找匹配的`''时出现意外的EOF testdb:-c:第1行:语法错误:文件意外结束

1 个答案:

答案 0 :(得分:2)

字符串上的Groovys execute()仅在空白处分割,因此这仅对非常简单的命令有用。始终在数组上使用execute()

def proc = ["sudo", "su", "oracle", "-c", "/home/oracle/scripts/datapump/refresh_database.sh ${target_database} ${version}"].execute()

或者,如果您更喜欢引用Shell,请使用["sh", "-c", "sudo ..."].execute()

另外,请注意:sudo具有-u参数。