[英]unexpected token '.' when executing a shell command when changing file extension within groovy script
我正在尝试在 a.groovy 脚本中运行以下命令:
sh """#!/bin/bash -ex
find .. -name "*.gcda" | \
xargs -I {} sh -c 'file=${0}; echo "${file%.*}".gcno' {} | \
xargs -I {} sh -c 'gcov {} -o "\$(dirname {})"' \\;
"""
不是最漂亮的命令,但我正在查找.gcda
文件名列表,将这些字符串更改为具有.gcno
扩展名,然后最终在文件名的.gcno
版本上运行命令。
我得到的错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 92: unexpected token: . @ line 92, column 60.
h -c 'file=${0}; echo "${file%.*}".gcno'
^
1 error
当我在终端中运行这个命令时它运行良好,当我在 Jenkins 中执行它时它只是抱怨。 我尝试了 escaping 一些东西,但无法弄清楚。
这是重现问题的更简单方法:
unexpected token: . @ line 1, column 14.
""" echo ${1%.} """
^
发生这种情况是因为 Groovy 双引号字符串中的${..}
用于字符串插值。 相反,您希望 Groovy 不理会它们,以便 shell 可以解释它们。
您可以使用三重单引号来执行此操作,因为 Groovy 不会在其中进行字符串插值(但与 bash 本身不同,它仍然解释反斜杠):
sh '''#!/bin/bash -ex
find .. -name "*.gcda" | \
xargs -I {} sh -c 'file=${0}; echo "${file%.*}".gcno' {} | \
xargs -I {} sh -c 'gcov {} -o "$(dirname {})"' \\;
'''
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.