Groovy执行sed命令报错:未知命令`''`的解决方法
Groovy execute()执行sed命令报错:
unknown command: ''`的修复方案 这个问题的核心是Groovy的execute()方法处理字符串命令和shell的解析逻辑不一样。当你在命令行运行sed -i '1 i <?xml version="1.1"?>' test.xml时,shell会帮你把单引号里的内容当成一个完整的参数;但用Groovy字符串调用execute()时,它只会简单按空格分割字符串,不会识别shell的引号,导致sed收到的参数被拆错了——比如'1被当成一个参数,i是另一个,这就触发了unknown command: ''`的错误。
修复方案:用列表形式传递命令参数
不要把整个命令写成一个字符串,而是把每个独立的参数作为列表的元素传递给execute(),这样每个参数会被操作系统正确解析,不会被错误分割。
修正你的初始代码:
// 用列表定义每个参数,不需要加单引号 def cmd = ['sed', '-i', '1 i <?xml version="1.1"?>', 'test.xml'] println cmd.join(' ') // 可以打印看看命令结构 def proc = cmd.execute() proc.waitFor() // 等待命令执行完成,避免异步问题 println proc.err.text // 检查错误输出,空则成功
针对你更新的insertversion方法,只需要确保参数列表正确即可,另外建议加上waitFor()等待命令执行完成,避免后续逻辑出现问题:
def insertversion(String filename) { def lines= new File(filename).readLines() if(!lines[0].contains('xml version')) { // 用列表传递参数,去掉多余的单引号 def cmd = ['sed', '-i', '1 i <?xml version="1.1"?>', filename] def proc = cmd.execute() proc.waitFor() // 等待命令执行完毕 if (proc.err.text) { println "执行出错:${proc.err.text}" } } }
为什么之前的尝试无效?
你之前尝试的两种字符串写法:
def cmd = /sed -i '1 i <?xml version="1.1"?>' test.xml/ def cmd = "sed -i '1 i <?xml version=\"1.1\"?>' test.xml"
本质还是把命令当成一个字符串传递,Groovy依然会按空格分割参数,单引号会被当成参数的一部分传递给sed,导致sed无法识别命令格式。
内容的提问来源于stack exchange,提问作者Bhanuchander Udhayakumar
相关产品推荐
相关产品推荐

