我正在 Jenkins CI/CD 软件中创建一个构建作业。构建作业将从 Github 克隆我的 android 项目并生成 APK。我正在使用 Ubuntu 20.04 LTS 服务器操作系统。
作为构建步骤的一部分,我通过 Jenkins 执行以下命令:
rm -r app/src/main/java/in/myproj/utils/Constants.kt
但收到以下错误:
/tmp/jenkins10737829520192897047.sh: 1: Syntax error: "in" unexpected
看起来 bash 将文件夹名称in
视为Constant
.从今天早上开始,我一直在尝试寻找解决方案,但惨遭失败。任何帮助是极大的赞赏。
编辑:
我进一步调试了该问题并找到了实际原因。这不是rm
命令失败。我还有另一个构建步骤,将一些代码片段附加到文件中。以下是实际失败的代码片段:
cat << EOT >> app/src/main/java/in/myproj/utils/Constants.kt
"package `in`.myproj.utils
class Constants {
companion object {
const val BASE_URL = "https://api.example.in/api/"
const val BASE_URL_IMAGE_ADDRESS = "https://dashboard.example.in:5555/"
const val BASE_URL_PROFILE_IMAGE_ADDRESS = "https://api.example.in/"
const val ABOUT_US_URL = "https://example.in/aboutus.html"
const val PRIVACY_POLICY_URL = "https://example.in/privacy-policy.html"
const val TERMS_AND_CONDITIONS_URL = "https://example.in/terms-condition.html"
const val REQUEST_TIMEOUT_DURATION = 10
const val STATUS_SUCCESS = 1
答案1
问题在于您如何使用 EOT。当使用未引用的word 作为定界符分隔符,定界符的内容将在写入之前由 shell 扩展。正如中所解释的bash手册:
如果引用了 word 的任何部分,则分隔符是对 word 删除引号的结果,并且此处文档中的行不会扩展。如果word不加引号,则here-document的所有行都会进行参数扩展、命令替换和算术扩展,字符序列\newline被忽略,并且必须使用'\'来引用字符'\'、'$ ”和“”。
因此,`in`
shell 正在将heredoc 中的 读取为命令替换,因此它尝试运行该命令in
并返回其输出。
实际上,这意味着您需要引用EOT
:
cat << 'EOT' >> app/src/main/java/in/myproj/utils/Constants.kt
请注意,这意味着您在此处文档中可能拥有的任何变量也不会被扩展,但由于我在您的问题中没有看到任何变量,所以我假设这不是问题。